Кто-нибудь знает, как легко найти символы в Юникоде, похожие на символы ASCII. Примером может служить «CYRILLIC SMALL LETTER DZE (ѕ)». Я бы хотел выполнить поиск и заменить похожие символы. Схожую я имею в виду, что человек читаем. Вы не видите разницы, глядя на нее.Найти аналогичный символ ASCII в Юникоде
ответ
Как отмечают другие комментаторы, Unicode normalisation («compatibilty characters») не поможет вам здесь, так как вы не ищете официальные эквивалентности, а для сходства в глифах (формы букв). (Связанный технический отчет Юникода по-прежнему стоит читать, хотя, поскольку он очень хорошо написан.)
Если бы я был вами, чтобы избавить вас от утомительной работы по сборке персонажей, я бы поискал ресурсы на homograph attacks: Это метод злонамеренно вводить в заблуждение веб-пользователей, отображая URL-адреса, содержащие имена доменов, в которых некоторые буквы были заменены визуально подобными буквами. Другой Unicode Technical Report, в разделе безопасности, содержит раздел о проблеме. Существует также - и это может быть то, что вам больше всего нужно - "confusables" table. Вот еще одна статья, в основном знаки препинания, некоторые из которых ASCII, которые имеют визуально похожие аналоги в non-ASCII code tables.
Надеюсь, что вы не зададите вопрос о создании такой атаки.
См. Базу данных Юникода: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.
Каждая строка описывает Юникод caharacter, например:
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
, который, как вы можете видеть, не определяет характер совместимости.
Поле совместимости описывает последовательность символов, которая будет означать то же самое, что и соответствующий символ. В вашем примере совместимой последовательностью будет 'U + 0061' (буква 'a'), за которой следует' U + 02BE' (модификатор «правого полукольца»). Для символов из разных алфавитов было бы довольно необычно, чтобы там были последовательности совместимости - и это сделало бы то, что OP пытается сделать невозможным без дополнительной информации. – cHao
ОП указывает «аналогично символам ASCII», а не точно. Если вы ищете «a» с правильным полукольцом, вы можете согласиться на ASCII «a», если нет ничего другого. – adamk
Согласовано - в этом случае. Но если вы ищете ASCII-символ, похожий на кириллицу & # x0455 ;, который является самым примером используемого OP, это не сработает. – cHao
Спасибо за все хорошие ссылки и объяснения. Я на самом деле пытаюсь защитить от таких атак. :-) И я догадываюсь, что найду еще кое-что с ключевым словом "homograph attack". – DrDol
Это хорошо слышать :). Да, это ключевое слово, которое вам нужно! Я отредактировал ссылку (она указала на устаревшую версию). – chryss
Допустимое использование: для тестирования интернационализации у меня есть инструмент, который генерирует фальшивый текст на иностранном языке, используя похожие символы. Англоязычный тестер может читать «чужой» текст, но они также могут ясно сказать, что он не является жестко-английским. Хотя это не работает, если символ Юникода настолько схожим, что вы не можете отличить эту разницу. Я в основном делаю такие вещи, как добавление акцентов к гласным. – Kip