Что происходит с этими символами объединения Unicode и как мы можем их фильтровать?
กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Они недавно появились в комментарии facebook разделы.
Как мы можем зачистить?
4 ответов:
Что случилось с этими символами Юникода?
это символ с серией сочетания символов. Поскольку комбинирующие символы, о которых идет речь, хотят идти выше базового символа, они складываются (буквально). Например, случай
ก้้้้้้้้้้้้้้้้้้้้
...это ก (тайский символ ко-Кай) ( U+0E01), а затем 20 экземпляров тайского объединения характер май Тхо ( U+0E49).
Как мы можем зачистить?
вы может предварительно обработайте текст и ограничьте количество комбинирующих символов, которые могут быть применены к одному символу, но усилия могут не стоить награды. Вам понадобятся листы данных для всех текущих символов, чтобы вы знали, объединяются ли они или что, и вам нужно будет обязательно разрешить хотя бы несколько, потому что некоторые языки пишутся с несколькими диакритическими знаками на одной основе. Теперь, если вы хотите ограничить комментарии латинским набором символов, это было бы проще проверить диапазон, но, конечно, это только вариант, если вы хотите ограничить комментарии только несколькими языками. Дополнительная информация, таблицы кодов и т. д. в unicode.org.
кстати, если вы когда-нибудь захотите узнать, как был составлен какой-то символ, для другого вопроса совсем недавно я закодировал быстрый и грязный " Unicode показать мне" страница на JSBin. Вы просто копируете и вставляете текст в текстовую область, и он показывает вам все кодовые точки (~символы), из которых состоит текст, со ссылками, такими как приведенные выше, на страницу, описывающую каждый символ. Он работает только для кодовых точек в диапазоне U+FFFF и ниже, потому что он написан на JavaScript и для обработки символов выше U+FFFF в JavaScript вам нужно сделать больше работы, чем я хотел сделать для этого вопроса (потому что в JavaScript" символ " - это всегда 16 бит, что означает, что для некоторых языков символ может быть разделен на два отдельных символа JavaScript, и я не учитывал этого), но это удобно для большинства текстов...
Если у вас есть механизм регулярных выражений с приличной поддержкой Unicode, это тривиально для очистки такого рода строк. Например, в Perl вы можете удалить все, кроме первой комбинирующей метки, из каждого (воспринимаемого пользователем) символа следующим образом:
#!/usr/bin/perl use strict; use utf8; binmode(STDOUT, ':utf8'); my $string = "กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้"; $string =~ s/(\p{Mark})\p{Mark}+//g; # Strip excess combining marks print("$string\n");Это будет напечатано:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้
"Как мы можем санировать это" лучше всего ответить выше Ти Джей Краудер
однако, я думаю, что дезинфекция-это неправильный подход, и Кристи имеет право с
overflow:hiddenна css, содержащем элемент.по крайней мере, так я это решаю.
хорошо, это заняло у меня некоторое время, чтобы понять, я был под впечатлением, что объединение символов для создания zalgo ограничивается этими. Так я и ожидал следующее регулярное выражение чтобы поймать уродов.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})и это не сработало...
загвоздка в том, что список в wiki не охватывает весь диапазон комбинирования символов.
что дало мне подсказку
"ก้้้้้้้้้้้้้้้้้้้้".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,})в трудное, чтобы идентифицировать их, как только вы это сделаете - есть множество решений, включая некоторые хорошие выше.
надеюсь, что это экономит ваше время.
Comments