ᴇᴅɪᴛ: Добавлено точно то, что оригинальный вопрос ищет внизу.Это действительно круто.
Ответ на ваш вопрос о ʀᴏᴍᴀɴ ɴᴜᴍᴇʀᴀʟ ᴏɴᴇ и ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ: ДА .Вот быстрый способ проверить:
$ perl -Mcharnames=:full -MUnicode::Normalize -le 'print
NFKD "\N{ROMAN NUMERAL ONE}" eq NFKD "\N{LATIN CAPITAL LETTER I}"'
1
Однако, ответ на ваш вопрос о том, имеют ли символы, которые визуально неразличимы, имеют эквивалентность совместимости, наиболее определенно НЕТ!
Например, ᴄʜᴇʀᴏᴋᴇᴇ ʟᴇᴛᴛᴇʀ ɢᴏ (Ꭺ) выглядит как ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (A), но, безусловно, не является эквивалентом NFKD.Точно так же с ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀʟᴘʜᴀ (Α) и ᴄʏʀɪʟʟɪᴄ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (А) не являющимися NFKD-эквивалентами.Фактически, существует бесчисленное множество (ну, я не могу их сосчитать :) таких проблем.Например, единственные кодовые точки, эквивалентные NFKD ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ:
U+00041 A GC=Lu SC=Latin LATIN CAPITAL LETTER A
U+01D2C ᴬ GC=Lm SC=Latin MODIFIER LETTER CAPITAL A
U+024B6 Ⓐ GC=So SC=Common CIRCLED LATIN CAPITAL LETTER A
U+0FF21 A GC=Lu SC=Latin FULLWIDTH LATIN CAPITAL LETTER A
U+1D400 ? GC=Lu SC=Common MATHEMATICAL BOLD CAPITAL A
U+1D434 ? GC=Lu SC=Common MATHEMATICAL ITALIC CAPITAL A
U+1D468 ? GC=Lu SC=Common MATHEMATICAL BOLD ITALIC CAPITAL A
U+1D49C ? GC=Lu SC=Common MATHEMATICAL SCRIPT CAPITAL A
U+1D4D0 ? GC=Lu SC=Common MATHEMATICAL BOLD SCRIPT CAPITAL A
U+1D504 ? GC=Lu SC=Common MATHEMATICAL FRAKTUR CAPITAL A
U+1D538 ? GC=Lu SC=Common MATHEMATICAL DOUBLE-STRUCK CAPITAL A
U+1D56C ? GC=Lu SC=Common MATHEMATICAL BOLD FRAKTUR CAPITAL A
U+1D5A0 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF CAPITAL A
U+1D5D4 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD CAPITAL A
U+1D608 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
U+1D63C ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
U+1D670 ? GC=Lu SC=Common MATHEMATICAL MONOSPACE CAPITAL A
U+1F130 ? GC=So SC=Common SQUARED LATIN CAPITAL LETTER A
Аналогично, вот те кодовые точки, которые являются NFKD эквивалентными ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ, на которые вы смотрели:
U+00049 I GC=Lu SC=Latin LATIN CAPITAL LETTER I
U+01D35 ᴵ GC=Lm SC=Latin MODIFIER LETTER CAPITAL I
U+02110 ℐ GC=Lu SC=Common SCRIPT CAPITAL I
U+02111 ℑ GC=Lu SC=Common BLACK-LETTER CAPITAL I
U+02160 Ⅰ GC=Nl SC=Latin ROMAN NUMERAL ONE
U+024BE Ⓘ GC=So SC=Common CIRCLED LATIN CAPITAL LETTER I
U+0FF29 I GC=Lu SC=Latin FULLWIDTH LATIN CAPITAL LETTER I
U+1D408 ? GC=Lu SC=Common MATHEMATICAL BOLD CAPITAL I
U+1D43C ? GC=Lu SC=Common MATHEMATICAL ITALIC CAPITAL I
U+1D470 ? GC=Lu SC=Common MATHEMATICAL BOLD ITALIC CAPITAL I
U+1D4D8 ? GC=Lu SC=Common MATHEMATICAL BOLD SCRIPT CAPITAL I
U+1D540 ? GC=Lu SC=Common MATHEMATICAL DOUBLE-STRUCK CAPITAL I
U+1D574 ? GC=Lu SC=Common MATHEMATICAL BOLD FRAKTUR CAPITAL I
U+1D5A8 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF CAPITAL I
U+1D5DC ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD CAPITAL I
U+1D610 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
U+1D644 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
U+1D678 ? GC=Lu SC=Common MATHEMATICAL MONOSPACE CAPITAL I
U+1F138 ? GC=So SC=Common SQUARED LATIN CAPITAL LETTER I
Обратите внимание, что там нет no ɢʀᴇᴇᴋ ʟᴇᴛᴛᴇʀ ɪᴏᴛᴀ, просто в качестве одного примера.
Вы не можете использовать NFKD для поиска двойников, а некоторые вещи, которые Эквивалент НКФД не очень похож.Таким образом, вы не можете сделать это таким образом в общем случае.Это не проблема, которую вы даже можете начать рассматривать, не глядя на настоящие шрифты.
Я считаю, что ICU имеет расширенное, нестандартное свойство для этого, например \p{X-Confusable=A}
.Я скачал их файлы данных для этого, но пока не играл с ним.
Обновление
Оказывается, UTS # 39, Механизмы безопасности Unicode , имеет именно то, что вы ищете.Если вы извлечете его исходные текстовые файлы данных , вы сможете определить, какие кодовые точки потенциально могут быть смешаны друг с другом.
Например, в тексте ранее в этом сообщении я перечислил кодовые точки, которые были NFKD, эквивалентными ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ, и указал, что в этом наборе отсутствовало много потенциальных неясностей.Это связано с тем, что отображение NFKD не предназначено для обнаружения объектов с неопределенностью .Тем не менее, файлы данных из UTS # 39 в значительной степени предназначены именно для этой цели.
Чтобы повторить мое перечисление ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ, обновив его для обработки всех кодовых точек, которые UTS # 39 считает взаимно смешиваемыми с ним,мы их отформатировали с использованием unichars и отсортировали в порядке алгоритма сортировки Unicode, используя ucsort :
U+0007C | GC=Sm SC=Common VERTICAL LINE
U+02223 ∣ GC=Sm SC=Common DIVIDES
U+0FFE8 │ GC=So SC=Common HALFWIDTH FORMS LIGHT VERTICAL
U+00031 1 GC=Nd SC=Common DIGIT ONE
U+1D7CF ? GC=Nd SC=Common MATHEMATICAL BOLD DIGIT ONE
U+1D7D9 ? GC=Nd SC=Common MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
U+1D7E3 ? GC=Nd SC=Common MATHEMATICAL SANS-SERIF DIGIT ONE
U+1D7ED ? GC=Nd SC=Common MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
U+1D7F7 ? GC=Nd SC=Common MATHEMATICAL MONOSPACE DIGIT ONE
U+00049 I GC=Lu SC=Latin LATIN CAPITAL LETTER I
U+0FF29 I GC=Lu SC=Latin FULLWIDTH LATIN CAPITAL LETTER I
U+02160 Ⅰ GC=Nl SC=Latin ROMAN NUMERAL ONE
U+02110 ℐ GC=Lu SC=Common SCRIPT CAPITAL I
U+02111 ℑ GC=Lu SC=Common BLACK-LETTER CAPITAL I
U+1D408 ? GC=Lu SC=Common MATHEMATICAL BOLD CAPITAL I
U+1D43C ? GC=Lu SC=Common MATHEMATICAL ITALIC CAPITAL I
U+1D470 ? GC=Lu SC=Common MATHEMATICAL BOLD ITALIC CAPITAL I
U+1D4D8 ? GC=Lu SC=Common MATHEMATICAL BOLD SCRIPT CAPITAL I
U+1D540 ? GC=Lu SC=Common MATHEMATICAL DOUBLE-STRUCK CAPITAL I
U+1D574 ? GC=Lu SC=Common MATHEMATICAL BOLD FRAKTUR CAPITAL I
U+1D5A8 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF CAPITAL I
U+1D5DC ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD CAPITAL I
U+1D610 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
U+1D644 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
U+1D678 ? GC=Lu SC=Common MATHEMATICAL MONOSPACE CAPITAL I
U+00196 Ɩ GC=Lu SC=Latin LATIN CAPITAL LETTER IOTA
U+0006C l GC=Ll SC=Latin LATIN SMALL LETTER L
U+0FF4C l GC=Ll SC=Latin FULLWIDTH LATIN SMALL LETTER L
U+0217C ⅼ GC=Nl SC=Latin SMALL ROMAN NUMERAL FIFTY
U+02113 ℓ GC=Ll SC=Common SCRIPT SMALL L
U+1D425 ? GC=Ll SC=Common MATHEMATICAL BOLD SMALL L
U+1D459 ? GC=Ll SC=Common MATHEMATICAL ITALIC SMALL L
U+1D48D ? GC=Ll SC=Common MATHEMATICAL BOLD ITALIC SMALL L
U+1D4C1 ? GC=Ll SC=Common MATHEMATICAL SCRIPT SMALL L
U+1D4F5 ? GC=Ll SC=Common MATHEMATICAL BOLD SCRIPT SMALL L
U+1D529 ? GC=Ll SC=Common MATHEMATICAL FRAKTUR SMALL L
U+1D55D ? GC=Ll SC=Common MATHEMATICAL DOUBLE-STRUCK SMALL L
U+1D591 ? GC=Ll SC=Common MATHEMATICAL BOLD FRAKTUR SMALL L
U+1D5C5 ? GC=Ll SC=Common MATHEMATICAL SANS-SERIF SMALL L
U+1D5F9 ? GC=Ll SC=Common MATHEMATICAL SANS-SERIF BOLD SMALL L
U+1D62D ? GC=Ll SC=Common MATHEMATICAL SANS-SERIF ITALIC SMALL L
U+1D661 ? GC=Ll SC=Common MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
U+1D695 ? GC=Ll SC=Common MATHEMATICAL MONOSPACE SMALL L
U+001C0 ǀ GC=Lo SC=Latin LATIN LETTER DENTAL CLICK
U+00399 Ι GC=Lu SC=Greek GREEK CAPITAL LETTER IOTA
U+1D6B0 ? GC=Lu SC=Common MATHEMATICAL BOLD CAPITAL IOTA
U+1D6EA ? GC=Lu SC=Common MATHEMATICAL ITALIC CAPITAL IOTA
U+1D724 ? GC=Lu SC=Common MATHEMATICAL BOLD ITALIC CAPITAL IOTA
U+1D75E ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
U+1D798 ? GC=Lu SC=Common MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
U+02C92 Ⲓ GC=Lu SC=Coptic COPTIC CAPITAL LETTER IAUDA
U+00406 І GC=Lu SC=Cyrillic CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
U+004C0 Ӏ GC=Lu SC=Cyrillic CYRILLIC LETTER PALOCHKA
U+005D5 ו GC=Lo SC=Hebrew HEBREW LETTER VAV
U+005DF ן GC=Lo SC=Hebrew HEBREW LETTER FINAL NUN
U+007CA ߊ GC=Lo SC=Nko NKO LETTER A
U+02D4F ⵏ GC=Lo SC=Tifinagh TIFINAGH LETTER YAN
U+0A4F2 ꓲ GC=Lo SC=Lisu LISU LETTER I
Изящно, хотя, это становится еще лучше.Файлы данных включают в себя не только единственные кодовые точки, но также и некоторые, которые в некоторых случаях могут требовать нескольких кодовых точек.Например, вот один такой набор, на этот раз в собственном формате файла:
# C̦ С̡ Ç Ҫ
( C̦ ) 0043 0326 LATIN CAPITAL LETTER C, COMBINING COMMA BELOW
← ( С̡ ) 0421 0321 CYRILLIC CAPITAL LETTER ES, COMBINING PALATALIZED HOOK BELOW
← ( Ç ) 00C7 LATIN CAPITAL LETTER C WITH CEDILLA # →Ҫ→→С̡→
← ( Ҫ ) 04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER # →С̡→
Разве это не здорово?Единственная загвоздка в том, что если вы не используете классы ICU, вам придется свернуть свои собственные из файлов данных UTS # 39.
Поскольку нет других языковых привязок, о которых я знаю, я добавил в свой список to для создания привязок Perl, чтобы имитировать стиль написания ICU \p{X-Confusable=I}
в движке регулярных выражений.
Обратите внимание, что вы также можете рассмотреть UTS # 36 и UTS # 39, которые класс ICU SpoofChecker
обрабатывает для вас.Это специально для вещей типа URI (читай: интернет-идентификаторы, которые используют ограниченный набор символов), а не только для любого старого произвольного текста.