program tip

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

radiobox 2020. 9. 8. 07:51
반응형

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


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

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

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


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

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

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

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

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

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

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


괜찮은 유니 코드를 지원하는 정규식 엔진이 있다면 이런 종류의 문자열을 삭제하는 것은 간단합니다. 예를 들어 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");

다음과 같이 인쇄됩니다.

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


TJ Crowder 는 "어떻게 이것을 살균 할 수 있습니까?"

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

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


Ok this one took me a while to figure out, I was under impression that combining characters to produce zalgo are limited to these. So I expected following regex to catch the freaks.

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

and it didn't work...

The catch is that list in wiki does not cover full range of combining characters.

What gave me a hint is "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16) = "e49" which in not within a range of combining, it falls into 'Private use'.

In C# they fall under UnicodeCategory.NonSpacingMark and following script flushes them out:

    [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>");
    }

By looking at the table generated you should be able to see which ones do stack. One range that is missing on wiki is 06D6-06DC another 0730-0749.

UPDATE:

Here's updated regex that should fish out all the zalgo including ones bypassed in 'normal' range.

([\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,})

The hardest bit is to identify them, once you have done that - there's multitude of solutions including some good ones above.

Hope this saves you some time.

참고URL : https://stackoverflow.com/questions/10414864/whats-up-with-these-unicode-combining-characters-and-how-can-we-filter-them

반응형