unicode - 拉丁大写字母 I (U+0049) 和罗马数字一 (U+2160) 是否具有 unicode 兼容性等价性?

标签 unicode

Unicode定义了两种等价000规范等价和兼容性等价。 Unicode Technical Annex #15 中关于兼容性等价的示例是 SUPERSCRIPT ONE (U+00B9) 和 DIGIT ONE (U+0031)。它不讨论视觉上无法区分的字符。

我很好奇在视觉上无法区分的字符是否在标准下具有兼容性等价性。

谢谢..

最佳答案

ᴇᴅɪᴛ:已添加 正是 原始问题在底部寻找什么。这真的很酷。

关于 ʀᴏᴍᴀɴ ɴᴜᴍᴇʀᴀʟ ᴏɴᴇ 和 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ 的问题的答案是 .这是一个快速检查的方法:

$ perl -Mcharnames=:full -MUnicode::Normalize -le 'print
   NFKD "\N{ROMAN NUMERAL ONE}"  eq  NFKD "\N{LATIN CAPITAL LETTER I}"'
1

但是,关于视觉上无法区分的字符是否具有兼容性等价的问题的答案绝对是 。不!

例如,ᴄʜᴇʀᴏᴋᴇᴇ ʟᴇᴛᴛᴇʀ ɢᴏ (Ꭺ) 看起来像 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (A),但肯定不是 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

请注意,这里没有 ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪᴏᴛᴀ,仅作为一个例子。

您不能使用 NFKD 来查找相似对象,并且某些与 NKFD 等效的东西看起来不太相似。所以在一般情况下你不能这样做。这不是一个问题,您甚至可以在不查看实际字体的情况下开始查看。

我相信 ICU 对此有一个扩展的非标准属性,例如 \p{X-Confusable=A} .我为此下载了他们的数据文件,但还没有玩太多。

更新

原来UTS #39, Unicode Security Mechanisms , 正是你要找的东西。如果您获取 its raw, plaintext datafiles ,您将能够确定哪些代码点可能相互混淆。

例如,在本消息前面的文本中,我列举了与 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ 等价的 NFKD 代码点,并指出该集合中缺少许多潜在的易混淆项。这是因为 NFKD 映射并非旨在检测可混淆物。然而,来自 UTS#39 的数据文件正是为这个目的而设计的。

为了重做我的 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ 枚举,更新它以处理 UTS#39 认为与它相互混淆的所有代码点,我们有这些,使用 unichars 格式化并使用 ucsort 按照 Unicode 排序算法的顺序排序:
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 数据文件中滚动您自己的类。

由于没有其他我知道的语言绑定(bind),我已将其添加到我的 ᴛᴏᴅᴏ 列表中以创建 Perl 绑定(bind)以模仿 ICU 的写作风格 \p{X-Confusable=I}在正则表达式引擎中。

请注意,您可能还希望同时考虑 UTS#36 和 UTS#39,ICU SpoofChecker 类句柄为您服务。它专门用于 URI 类型的东西(阅读:互联网标识符,它使用受限字符集),而不仅仅是任何旧的任意文本。

关于unicode - 拉丁大写字母 I (U+0049) 和罗马数字一 (U+2160) 是否具有 unicode 兼容性等价性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841290/

相关文章:

unicode - Unicode 可打印字符的范围是多少?

c++ - UTF-16BE 到 UTF-8 使用 Boost.Locale 产生垃圾

sql-server - 如何判断排序规则是使用单词排序还是字符串排序?

unicode - 如何在 SVG 中显示 unicode?

c++ - 生成一个随机的unicode字符串

unicode - 如何在 NSIS 自定义页面中编写波斯语?

html - 如何获取 Racket 中编码所表示的字符?

windows - 如何在 Windows 中使用 subversion 操作以 unicode 命名的文件?

python - Django ORM 和 Unicode 数据

python - ast.literal_eval 以某种方式抛出 UnicodeDecodeError