Что случилось с этими комбинированными символами Unicode и как мы можем их отфильтровать?

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

Они недавно появились в разделах комментариев Facebook.

Как мы можем продезинфицировать это?


person XCS    schedule 02.05.2012    source источник
comment
Вы раньше не задавались этим вопросом? (Честный вопрос.)   -  person Ry-♦    schedule 02.05.2012
comment
Это определенно не ascii   -  person Chris Eberle    schedule 02.05.2012
comment
Если бы я был, я бы не спрашивал его снова.   -  person XCS    schedule 02.05.2012
comment
Извините, мой плохой, изменил теги на юникод.   -  person XCS    schedule 02.05.2012
comment
попробуйте перевести их с помощью translate.google.com   -  person Ashwini Chaudhary    schedule 02.05.2012
comment
@AshwiniChaudhary Я сделал это, и каков должен быть ожидаемый результат? Не сильно изменилось...   -  person mas-designs    schedule 02.05.2012
comment
Почему заключительные голоса? Это вопрос, связанный с программированием, так как я хочу знать, как дезинфицировать этот тип ввода, чтобы разделы комментариев на моем веб-сайте не были игровой площадкой 13-летнего...   -  person XCS    schedule 02.05.2012
comment
How can we sanitize this? -- Почему?   -  person Yakov Galka    schedule 03.05.2012
comment
กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิ так комментарии разделы на моем сайте не будут 13 лет игровой площадки. На самом деле без дезинфекции один из этих символов может сделать комментарий над ним нечитаемым, что совсем не приятно для пользователя.   -  person XCS    schedule 03.05.2012
comment
Разве мы не должны считать это ошибкой браузера? На мой взгляд, браузер должен увеличить содержащее поле, чтобы весь текст, включая диакритические знаки, помещался внутри и не выходил за пределы других полей или под ними.   -  person voidengine    schedule 03.05.2012
comment
@pjotr Это определенно не ошибка браузера. Если вы хотите, чтобы символы не переполняли содержащееся поле, вы можете просто решить это с помощью CSS (overflow:hidden;)...   -  person XCS    schedule 03.05.2012
comment
@Cristy: Отличное замечание по поводу overflow: hidden.   -  person T.J. Crowder    schedule 04.05.2012
comment
Другой пост об этой конкретной проблеме с отображением (только связанный, а не дубликат): Какая используется кодировка символов?   -  person Pops    schedule 05.05.2012
comment
На основе этого ответа: stackoverflow.com/questions/7119115/ Похоже, что это проблема браузера или даже ОС. Возникла проблема с тайским Unicode.   -  person FlipMcF    schedule 15.03.2013
comment
Связанный: Как работает текст Zalgo?   -  person nwellnhof    schedule 28.01.2014
comment
В качестве примечания: кажется, что stackoverflow исправил эту проблему с большими символами Unicode, перекрывающими другой текст.   -  person XCS    schedule 14.10.2017


Ответы (4)


Что случилось с этими символами юникода?

Это символ с набором комбинаций символов. Поскольку рассматриваемые комбинированные символы хотят идти выше базового символа, они складываются (буквально). Например, случай

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

...это ก (тайский иероглиф ko kai) (U+0E01), за которыми следуют 20 копий тайского комбинированного символа mai tho (U +0E49).

Как мы можем продезинфицировать это?

Вы можете предварительно обработать текст и ограничить количество комбинируемых символов, которые можно применить к одному символу, но усилия могут не стоить вознаграждения. Вам понадобятся таблицы данных для всех текущих символов, чтобы вы знали, комбинируются ли они или что, и вам нужно обязательно разрешить хотя бы несколько, потому что некоторые языки написаны с несколькими диакритическими знаками на одной базе. . Теперь, если вы хотите ограничить комментарии набором латинских символов, это будет более простой проверкой диапазона, но, конечно, это только вариант, если вы хотите ограничить комментарии только несколькими языками. Дополнительная информация, таблицы кодов и т. д. на unicode.org.

Кстати, если вы когда-нибудь захотите узнать, как был составлен какой-либо символ, для другого вопроса совсем недавно я закодировал быструю и грязную страницу «Unicode Show Me». на JSBin. Вы просто копируете и вставляете текст в текстовую область, и он показывает вам все кодовые точки (~символы), из которых состоит текст, со ссылками, подобными приведенным выше, на страницу с описанием каждого символа. Он работает только для кодовых точек в диапазоне U+FFFF и ниже, потому что он написан на JavaScript, и для обработки символов выше U+FFFF в JavaScript вам нужно проделать больше работы, чем я хотел сделать для этого вопроса (потому что в JavaScript «символ» всегда 16-битный, что означает, что для некоторых языков символ может быть разделен на два отдельных «символа» JavaScript, и я не учел этого), но это удобно для большинства текстов. .

person T.J. Crowder    schedule 02.05.2012
comment
Не могли бы вы просто удалить повторяющиеся копии одного и того же комбинированного кода в одну копию? Когда вам когда-нибудь понадобится объединять одну и ту же кодовую точку с базовой кодовой точкой более одного раза? - person Remy Lebeau; 03.05.2012
comment
@RemyLebeau: Когда вам когда-нибудь понадобится объединять одну и ту же кодовую точку с базовой кодовой точкой более одного раза? Я не знаю, я очень-очень мало знаю о том, как вы пишете на других языках - тайском, например. Я совсем не удивлюсь, если узнаю, что в некоторых из них допустимо несколько одинаковых кодовых точек. Но это не уменьшает сложности; вам все еще нужна одна из таблиц Unicode, чтобы выяснить, какие из них объединяют символы. - person T.J. Crowder; 03.05.2012
comment
Я заставил вашу страницу принимать строку юникода из URL-адреса, например. jsbin.com/erajer/7/ - person ubershmekel; 12.03.2013
comment
Библиотека JavaScript для простого удаления комбинированных меток Unicode из строк: mths.be/stripcombiningmarks - person Mathias Bynens; 08.01.2014
comment
JavaScript использует UTF-16 с « суррогатными парами » - person dolmen; 26.07.2016
comment
@dolmen: UTF-16 всегда имеет возможность суррогатных пар. Вы имеете в виду, что JavaScript допускает недопустимые последовательности, в то время как (конечно, UTF-16 - нет). - person T.J. Crowder; 26.07.2016

Если у вас есть движок регулярных выражений с достойной поддержкой Unicode, дезинфицировать такие строки несложно. В 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");

Это напечатает:

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

person nwellnhof    schedule 12.03.2013
comment
Я не умею читать по-тибетски, но меня беспокоит, что такой подход грубой силы может лишить функциональность языка. Я видел юникод, который имеет законные варианты использования более чем одной объединяющей метки. Арабский - хороший пример. Я постараюсь не забыть запустить это моими тибетскими коллегами. - person FlipMcF; 12.03.2013
comment
Вы правы, безусловно, есть случаи, когда несколько комбинированных знаков являются законными. Но вы можете легко изменить регулярное выражение, чтобы разрешить определенный максимум оценок. - person nwellnhof; 12.03.2013
comment
Проголосовал за, потому что он отвечает на вопрос «как вы это дезинфицируете». Но я думаю, что это будет кошмар обслуживания. - person FlipMcF; 15.03.2013
comment
Кроме того, RE просто удаляет соседние дубликаты. Не стал бы убирать, скажем: <base><macron><overline><macron><overline>.... Таким образом, если вашему тексту требуется сочетание нескольких различных символов, он пройдет нормально; и вредоносный текст все еще может быть создан. - person Jesse Chisholm; 10.07.2018

«Как мы можем это продезинфицировать» лучше всего ответил TJ Crowder выше.

Однако я думаю, что дезинфекция - это неправильный подход, и Cristy правильно использует overflow:hidden в элементе, содержащем css.

По крайней мере, я так решаю.

person FlipMcF    schedule 12.03.2013

Хорошо, это заняло у меня некоторое время, чтобы понять, у меня сложилось впечатление, что объединение символов для создания zalgo ограничено этими . Поэтому я ожидал, что следует за регулярным выражением, чтобы поймать уродов.

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

Глядя на сгенерированную таблицу, вы сможете увидеть, какие из них складываются. Один диапазон, которого нет в вики, это 06D6-06DC другой 0730-0749.

ОБНОВЛЕНИЕ:

Вот обновленное регулярное выражение, которое должно вылавливать все zalgo, включая те, которые были пропущены в "нормальном" диапазоне.

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

Самое сложное — это идентифицировать их, как только вы это сделаете — существует множество решений, в том числе несколько хороших из приведенных выше.

Надеюсь, это сэкономит вам время.

person Matas Vaitkevicius    schedule 17.03.2016
comment
Я бы сказал, не спамить этим спамом! - person Praveen Kumar Purushothaman; 17.03.2016
comment
@PraveenKumar Не могли бы вы уточнить, что вы имеете в виду? - person Matas Vaitkevicius; 17.03.2016
comment
Я ценю ваш ответ, но это вопрос с потерянным ответом. Так зачем добавлять новые ответы без необходимости? Это только мой взгляд. Более того, ваш ответ не JavaScript, верно? - person Praveen Kumar Purushothaman; 17.03.2016
comment
@PraveenKumar Это раскрывает, почему обычная проверка zalgo ([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,}) не работает. Вам не кажется интересным, что стекирование юникода не ограничивается тем, что есть в вики? Что вы подразумеваете под «потерянным ответом на вопрос»? EDIT: вам может показаться странным добавлять ответ на вопрос трехлетней давности, но, поскольку мне потребовалось некоторое время, чтобы понять, почему этот тип zalgo работает, я не мог позволить таким знаниям пропасть зря. . Следующий парень сэкономит время. - person Matas Vaitkevicius; 17.03.2016
comment
@PraveenKumar в вопросе не указан язык, и публикация нового ответа на старый вопрос вполне уместна, если старые ответы были в чем-то несовершенны. К сожалению, у меня недостаточно опыта в решении этой проблемы, иначе я бы проголосовал за нее. - person Mark Ransom; 21.03.2016
comment
Преимущество этого RE состоит в том, что он улавливает смешанные комбинированные символы, а его недостаток заключается в том, что он никогда не позволяет использовать базу, которая должным образом требует более одного комбинированного символа. - person Jesse Chisholm; 10.07.2018