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


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 가 가장 잘 대답했습니다.

그러나 위생 처리는 잘못된 접근 방식이라고 생각하며 Cristyoverflow: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.