이러한 유니 코드 결합 문자는 무엇이며 어떻게 필터링 할 수 있습니까?


91

กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้

최근 페이스 북 댓글 섹션에 표시되었습니다.

이것을 어떻게 살균 할 수 있습니까?


5
전에이 질문을 한 적이 없습니까? (정직한 질문)
— Ry-

5
그 대부분의 확실히 아스키
— 크리스 Eberle는

31
종결 표는 왜? 프로그래밍 관련 질문입니다. 이러한 유형의 입력을 삭제하는 방법을 알고 싶습니다. 그래서 제 웹 사이트의 댓글 섹션이 13 세의 놀이터가되지 않도록합니다 ...
— XCS

17
กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิ "내 웹 사이트에 코멘트 섹션에서는 13 세의 놀이터.하지 않도록" 실제로 위생 처리없이 이러한 문자를 게시하면 위의 주석을 읽을 수 없게 될 수 있으며 이는 전혀 즐거운 사용자 경험이 아닙니다.
— XCS

14
@pjotr 확실히 브라우저 버그가 아닙니다. 문자가 포함 된 상자를 넘치지 않게하려면 CSS (overflow : hidden;)로 간단히 해결할 수 있습니다 ...
— XCS

답변:


80

이 유니 코드 문자는 무엇입니까?

일련의 결합 문자가있는 문자 입니다. 문제의 결합 문자는 기본 문자 위로 가기를 원하기 때문에 (문자 그대로) 쌓입니다. 예를 들어,

ก้้้้้้้้้้้้้้้้้้้้้้

... 그것은 ก (태국 문자 ko kai ) ( U + 0E01 ) 뒤에 태국어 결합 문자 mai tho ( U + 0E49 )의 20 개 사본이 이어집니다 .

이것을 어떻게 살균 할 수 있습니까?

당신은 할 수 - 사전 처리하는 텍스트를 단일 문자에 적용 할 수있는 결합 문자의 수를 제한하지만, 노력은 가치가 보상하지 않을 수 있습니다. 현재 모든 문자에 대한 데이터 시트가 필요하므로 조합 여부를 알 수 있으며 일부 언어는 단일 기반에 여러 분음 부호로 작성되기 때문에 최소한 몇 개를 허용해야합니다. . 이제 주석을 라틴 문자 집합으로 제한하려면 더 쉬운 범위 검사가 될 수 있지만 물론 주석을 몇 가지 언어로 제한하려는 경우에만 옵션입니다. 자세한 정보, 코드 시트 등은 unicode.org에서 확인할 수 있습니다.

BTW, 만약 당신이 어떤 캐릭터가 어떻게 구성되었는지 알고 싶다면, 최근에 또 다른 질문 에 대해 JSBin에 빠르고 더러운 "Unicode Show Me"페이지 를 코딩했습니다. 텍스트 영역에 텍스트를 복사하여 붙여 넣으면 텍스트가 구성되는 모든 코드 포인트 (~ 문자)가 각 문자를 설명하는 페이지에 대한 위와 같은 링크와 함께 표시됩니다. U + FFFF 이하 범위의 코드 포인트에서만 작동합니다. JavaScript로 작성되었고 JavaScript에서 U + FFFF 위의 문자를 처리하려면 해당 질문에 대해 원하는 것보다 더 많은 작업을 수행해야합니다 (JavaScript에서는 "문자"는 항상 16 비트, 이는 일부 언어의 경우 문자가 두 개의 개별 자바 스크립트 "문자"로 분할 될 수 있음을 의미하며 저는이를 설명하지 않았습니다),하지만 대부분의 텍스트에 편리합니다 ...


1
동일한 결합 코드 포인트의 반복 된 사본을 연속적으로 단일 사본으로 삭제하지 않겠습니까? 동일한 코드 포인트를 기본 코드 포인트에 두 번 이상 결합해야하는 경우는 언제입니까?
— Remy Lebeau

4
@RemyLebeau : "언제 동일한 코드 포인트를 기본 코드 포인트에 두 번 이상 결합해야합니까?" 나는 당신이 다른 언어를 쓰는 방법에 대해 거의 알지 못합니다. 예를 들어 태국어입니다. 동일한 코드 포인트 중 하나 이상이 일부에서 유효하다는 사실에 전혀 놀라지 않을 것입니다. 하지만 그렇게한다고해서 복잡성이 줄어들지는 않습니다. 어떤 것이 문자를 결합하는지 알아 내기 위해서는 여전히 유니 코드 테이블 중 하나가 필요합니다.
— TJ Crowder

나는 당신의 페이지의 URL 예에서 유니 코드 문자열 동의했다 jsbin.com/erajer/7/...
— ubershmekel

2
자바 스크립트 라이브러리는 쉽게 유니 코드 문자열에서 표시를 결합 제거합니다 : mths.be/stripcombiningmarks
— 마티아스 Bynens

자바 스크립트는«와 UTF-16 사용하여 서로 게이트 쌍 »
— 고인돌

17

괜찮은 유니 코드를 지원하는 정규식 엔진이 있다면 이런 종류의 문자열을 삭제하는 것은 간단합니다. 예를 들어 Perl에서는 다음과 같이 모든 (사용자가 인식하는) 문자에서 첫 번째 결합 표시를 제외하고 모두 제거 할 수 있습니다.

#!/usr/bin/perl
use strict;
use utf8;

binmode(STDOUT, ':utf8');

my $string = "กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้";
$string =~ s/(\p{Mark})\p{Mark}+/$1/g; # Strip excess combining marks
print("$string\n");

다음과 같이 인쇄됩니다.

กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้


9
나는 티베트어를 읽을 수 없지만이 무차별 대입 접근 방식이 언어가 설계된 방식에서 기능을 제거 할 수 있다고 우려합니다. 하나 이상의 결합 마크를 합법적으로 사용하는 유니 코드를 보았습니다. 아랍어가 좋은 예입니다. 나는 티베트 동료들이 이것을 실행하는 것을 기억하려고 노력할 것입니다.
— FlipMcF 2013 년

2
맞습니다. 여러 개의 결합 표시가 합법적 인 경우가 있습니다. 그러나 특정 최대 마크를 허용하도록 정규식을 쉽게 변경할 수 있습니다.
— nwellnhof

'어떻게 이걸 삭제하나요'질문에 답하기 때문에 찬성했습니다. 그러나 이것은 유지 관리의 악몽이 될 것이라고 생각합니다.
— FlipMcF 2013 년

또한 RE는 인접한 중복을 제거합니다 . 다음과 같이 정리되지 않습니다 <base><macron><overline><macron><overline>.... 따라서 텍스트에 여러 개의 서로 다른 결합 문자가 필요한 경우 잘 전달됩니다. 악성 텍스트는 여전히 만들어 질 수 있습니다.
— Jesse Chisholm은

13

"어떻게 이것을 살균 할 수 있습니까?"는 위에서 TJ Crowder 가 가장 잘 대답했습니다.

그러나 위생 처리는 잘못된 접근 방식이라고 생각하며 Cristy 는 overflow:hiddenCSS 포함 요소에 대해 올바르게 처리 합니다.

적어도 그것이 내가 그것을 해결하는 방법입니다.


6

좋아, 이건 알아내는 데 시간이 좀 걸렸는데, 잘 고를 만들기 위해 캐릭터를 조합 하는 것은 이것들에만 국한 된다는 인상을 받았습니다 . 그래서 나는 괴물을 잡기 위해 정규식 을 따르기를 기대했습니다 .

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})

작동하지 않았습니다 ...

문제 는 위키의 목록이 문자 결합의 전체 범위를 다루지 않는다는 것입니다.

나에게 힌트를 준 것은 "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)= "e49"로 결합 범위 내에 있지 않으면 '개인 사용'에 해당합니다.

C #에서 그들은 아래로 떨어지고 UnicodeCategory.NonSpacingMark다음 스크립트는 그들을 플러시합니다.

    [Test]
    public void IsZalgo()
    {
        var zalgo = new[] { UnicodeCategory.NonSpacingMark };

        File.Delete("IsModifyLike.html");
        File.AppendAllText("IsModifyLike.html", "<table>");
        for (var i = 0; i < 65535; i++)
        {
            var c = (char)i;
            if (zalgo.Contains(Char.GetUnicodeCategory(c)))
            {


                File.AppendAllText("IsModifyLike.html", string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>A&#{3};&#{3};&#{3}</td></tr>\n",  i.ToString("X"), c, Char.GetUnicodeCategory(c), i));

            }
        }
        File.AppendAllText("IsModifyLike.html", "</table>");
    }

생성 된 테이블을 살펴보면 어떤 테이블이 스택되는지 확인할 수 있습니다. wiki에서 누락 된 범위 중 하나는 06D6-06DC다른 범위입니다 0730-0749.

최신 정보:

다음 은 '정상'범위에서 우회 된 것을 포함하여 모든 잘 고를 처리해야하는 업데이트 된 정규식 입니다.

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,})

가장 어려운 부분은 일단 확인한 후 확인하는 것입니다. 위의 몇 가지 좋은 솔루션을 포함하여 다양한 솔루션이 있습니다.

이것이 시간을 절약하기를 바랍니다.


이 스팸을 스팸하지 말라고 말하고 싶습니다!
— Praveen Kumar Purushothaman

@PraveenKumar 무슨 뜻인지 자세히 설명해 주시겠습니까?
— Matas Vaitkevicius

답변 해주셔서 감사합니다.이 질문은 답을 잃어버린 질문입니다. 그렇다면 왜 불필요하게 새로운 답변을 추가해야합니까? 내 견해 일뿐입니다. 게다가, 당신의 대답은 JavaScript가 아닙니다.
— Praveen Kumar Purushothaman

4
@PraveenKumar 정상적인 zalgo 유효성 검사 ([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})가 작동하지 않는 이유를 밝힙니다 . 스택 유니 코드가 위키의 내용에 국한되지 않는다는 것이 흥미롭지 않습니까? '답변을 잃은 질문'이란 무엇을 의미합니까? 편집 : 3 년 된 질문에 대한 답변을 추가하는 것이 이상하다는 것을 알 수 있지만 이러한 유형의 잘 고가 작동하는 이유를 알아내는 데 시간이 걸리기 때문에 그러한 지식을 낭비하게 할 수 없었습니다. 다음 사람은 시간을 절약 할 것입니다.
— Matas Vaitkevicius 2011 년

7
@PraveenKumar 질문에는 언어가 명시되어 있지 않으며 이전 답변이 어떤 식 으로든 부족한 경우 이전 질문에 새 답변을 게시하는 것이 완전히 적절합니다. 불행히도 나는이 문제에 대한 충분한 경험이 없거나 나로부터 찬성표를 얻을 것입니다.
— Mark Ransom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.