Имеют ли LATIN CAPITAL LETTER I (U + 0049) и ROMAN NUMERAL ONE (U + 2160) эквивалентность юникодной совместимости? - PullRequest
9 голосов
/ 12 января 2012

Unicode определяет два вида эквивалентности 000: каноническая эквивалентность и эквивалентность совместимости.Пример в Техническом приложении Unicode № 15 для эквивалентности совместимости - SUPERSCRIPT ONE (U + 00B9) и DIGIT ONE (U + 0031)Здесь не рассматриваются символы, которые визуально неразличимы.

Мне любопытно, имеют ли символы, визуально неразличимые, эквивалентность совместимости по стандарту.

Ответы [ 3 ]

21 голосов
/ 13 января 2012

ᴇᴅɪᴛ: Добавлено точно то, что оригинальный вопрос ищет внизу.Это действительно круто.


Ответ на ваш вопрос о ʀᴏᴍᴀɴ ɴᴜᴍᴇʀᴀʟ ᴏɴᴇ и ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ: ДА .Вот быстрый способ проверить:

$ 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 (читай: интернет-идентификаторы, которые используют ограниченный набор символов), а не только для любого старого произвольного текста.

4 голосов
/ 12 января 2012

Да. Посмотрите в UnicodeData.txt :

2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
3 голосов
/ 13 января 2012

Ответ @ dan04 является правильным ответом на явный вопрос, но косвенный вопрос «имеют ли визуально неразличимые символы эквивалентность совместимости» имеет более сложный ответ.

Как правило, канонически эквивалентенсимволы или последовательности символов должны выглядеть одинаково.Грубо говоря, они представляют собой разную презентацию того же интуитивного символа, что и закодированные символы.Это, однако, зависит от нескольких практических соображений, и визуализация может фактически отличаться.

С другой стороны, символы могут быть визуально неразличимы, даже если их визуализация (глифы) идентичны в каждом известном шрифте.Например, любой обычный шрифт, который содержит заглавную латинскую букву A, заглавную греческую букву alpha и заглавную кириллицу A, имеет одинаковые глифы для них, но они по-прежнему являются совершенно разными символами, без сопоставления эквивалентности между ними.

Символы, совместимые с символами совместимости, могут отличаться в представлении, и они часто различаются, отчасти потому, что их различие часто носит стилистический характер.Но они не должны отличаться.

...