กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้
Они недавно появились в разделах комментариев facebook.
Как мы можем это очистить?
Ответы:
Это персонаж с серией комбинируемых персонажей . Поскольку рассматриваемые комбинируемые символы хотят быть выше базового символа, они складываются (буквально). Например, случай
ก้้้้้้้้้้้้้้้้้้้้
... это ก (тайский символ ko kai ) ( U + 0E01 ), за которым следует 20 копий тайского комбинированного символа mai tho ( U + 0E49 ).
Вы можете предварительно обработать текст и ограничить количество комбинируемых символов, которые могут быть применены к одному символу, но усилия могут не окупиться. Вам понадобятся таблицы данных для всех текущих символов, чтобы вы знали, объединяются ли они или что, и вам нужно обязательно разрешить хотя бы несколько, потому что некоторые языки написаны с несколькими диакритическими знаками на одной основе . Теперь, если вы хотите ограничить комментарии набором латинских символов, это будет более легкая проверка диапазона, но, конечно, это только вариант, если вы хотите ограничить комментарии только несколькими языками. Дополнительная информация, кодовые таблицы и т. Д. На unicode.org .
Кстати, если вы когда-нибудь захотите узнать, как был составлен какой-то символ, для другого вопроса совсем недавно я закодировал быструю и грязную страницу «Unicode Show Me» на 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}+/$1/g; # Strip excess combining marks print("$string\n");
Это напечатает:
กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก้ ก็ กิ ก้
источник
<base><macron><overline><macron><overline>...
. Итак, если вашему тексту нужно несколько разных комбинирующих символов, он пройдет нормально; и вредоносный текст все еще может быть создан."Как мы можем это дезинфицировать" лучше всего ответил TJ Crowder.
Однако я думаю, что дезинфекция - это неправильный подход, и Кристи правильно
overflow:hidden
использует элемент, содержащий css.По крайней мере, так я это решаю.
источник
Хорошо, это заняло у меня некоторое время, чтобы понять, у меня сложилось впечатление, что объединение символов для создания zalgo ограничивается ими . Поэтому я ожидал, что следующее регулярное выражение поймает уродов.
и это не сработало ...
Загвоздка в том, что список в вики не охватывает весь диапазон комбинируемых символов.
Что мне
"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
подсказало, так это = "e49", которое вне диапазона комбинирования, попадает в "Частное использование".В C # они подпадают под,
UnicodeCategory.NonSpacingMark
и следующий скрипт их сбрасывает:Посмотрев на сгенерированную таблицу, вы сможете увидеть, какие из них складываются. Один диапазон, который отсутствует в вики, - это
06D6-06DC
другой0730-0749
.ОБНОВИТЬ:
Вот обновленное регулярное выражение, которое должно выловить все zalgo, включая те, которые были пропущены в «нормальном» диапазоне.
Сложнее всего их идентифицировать, как только вы это сделаете - существует множество решений, в том числе некоторые хорошие.
Надеюсь, это сэкономит вам время.
источник
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
не работает. Вам не интересно, что укладка Unicode не ограничивается Whats on Wiki? Что вы имеете в виду под «потерянным ответом на вопрос»? РЕДАКТИРОВАТЬ : вам может показаться странным добавить ответ на вопрос трехлетней давности, но поскольку мне потребовалось время, чтобы понять, почему этот тип zalgo работает, я не мог позволить этим знаниям пропасть зря. Следующий парень сэкономит время.