Найти похожий символ ASCII в Unicode

Кто-нибудь знает простой способ найти символы в Unicode, похожие на символы ASCII. Примером может служить "СТРОЧНАЯ КИРИЛЛИЧНАЯ БУКВА DZE (ѕ)" . Я хотел бы выполнить поиск и заменить похожие символы. Под подобным я подразумеваю удобочитаемый для человека. Вы не можете увидеть разницу, глядя на него.


person DrDol    schedule 04.08.2010    source источник


Ответы (2)


Как отмечают другие комментаторы, нормализация Unicode ("символы совместимости") вам не поможет. здесь, поскольку вы ищете не официальные эквиваленты, а сходство в глифах (формах букв). (Однако связанный Технический отчет по Unicode все же стоит прочитать, так как он очень хорошо написан.)

На вашем месте, чтобы избавить вас от утомительной работы по самостоятельному составлению списка персонажей, я бы поискал ресурсы на атаки омографа: это метод злонамеренного введения веб-пользователей в заблуждение путем отображения URL-адресов, содержащих доменные имена, в которых некоторые буквы были заменены визуально похожими буквами. Другой Технический отчет Unicode, посвященный безопасности, содержит раздел, посвященный проблеме. Существует также — и это может быть то, что вам больше всего нужно — таблица "confusables" . Вот еще одна статья, в основном со знаками препинания, некоторые из которых ASCII, которые имеют визуально похожие аналоги в кодовые таблицы, отличные от ASCII.

Я очень надеюсь, что вы не задаете вопрос, чтобы построить такую ​​​​атаку.

person chryss    schedule 04.08.2010
comment
Спасибо за хорошие ссылки и пояснения. Я на самом деле стараюсь защищаться от таких атак. :-) И я думаю, что я найду кое-что еще с атакой омографа ключевого слова. - person DrDol; 05.08.2010
comment
Это приятно слышать :) . Да, это ключевое слово, которое вам нужно! Я отредактировал ссылку (она указывала на устаревшую версию). - person chryss; 05.08.2010
comment
Законное использование: для тестирования интернационализации у меня есть инструмент, который генерирует поддельный текст на иностранном языке, используя похожие символы. Англоговорящий тестировщик может прочитать иностранный текст, но он также может четко сказать, что это не жестко закодированный английский язык. Хотя это не работает, если символ юникода настолько похож, что вы не можете заметить разницу. В основном я делаю такие вещи, как добавление ударения к гласным. - person Kip; 02.04.2015
comment
Я использую это, чтобы создать ircbot, который никого не выделяет, если упоминает кого-то на канале :) - person Christophe De Troyer; 28.08.2020

См. базу данных Unicode: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Каждая строка описывает символ Юникода, например:

1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;

Если для этого символа есть похожие (совместимые) символы, он появится в поле <compat> записи. В этом примере 0061 (ASCII a) совместим с символом Unicode LATIN SMALL LETTER A WITH RIGHT HALF RING.

Что касается вашего персонажа, запись

0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405

который, как видите, не указывает символ совместимости.

person adamk    schedule 04.08.2010
comment
Поле совместимости описывает последовательность символов, которые означают то же самое, что и рассматриваемый символ. В вашем примере совместимой последовательностью будет U+0061 (буква «а»), за которой следует U+02BE (модификатор «правого полукольца»). Для символов из разных алфавитов было бы довольно необычно наличие последовательностей совместимости - и это сделало бы то, что пытается сделать OP, невозможным без дополнительной информации. - person cHao; 04.08.2010
comment
В ОП указано «похоже на символы ASCII», а не точно. Если вы ищете «а» с правым полукольцом, вы можете согласиться на ASCII «а», если ничего другого нет. - person adamk; 04.08.2010
comment
Согласен - в таком случае. Но если вы ищете символ ASCII, похожий на кириллицу ѕ, который является тем самым примером, который использовал OP, это не сработает. - person cHao; 04.08.2010
comment
@cHao: Вы правы - как я уже говорил в своем ответе, для конкретного символа, запрошенного OP, символы совместимости не являются полезным методом. - person adamk; 04.08.2010