LATIN CAPITAL LETTER I(U + 0049)和ROMAN NUMERAL ONE(U + 2160)是否具有unicode兼容性?

时间:2012-01-12 19:44:42

标签: unicode

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

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

谢谢..

3 个答案:

答案 0 :(得分:21)

ᴇᴅɪᴛ:在底部添加了 完全 原始问题的内容。这真的很酷。


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

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

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

例如,ᴄʜᴇʀᴏᴋᴇᴇʟᴇᴛᴛᴇʀɢᴏ(Ꭺ)看起来像ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀᴀ(A),但肯定不是NFKD等价物。类似地,ɢʀᴇᴇᴋᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀᴀʟᴘʜᴀ(Α)和ᴄʏʀɪʟʟɪᴄᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀᴀ(А)不是NFKD等价物。实际上有很多(好吧,我不能算数:)这样的问题。例如,NFKD等于ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀonly的唯一代码点是:

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格式化并按照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数据文件中推出自己的课程。

由于我没有其他语言绑定,我已添加到我的ᴛᴏᴅᴏ列表中创建Perl绑定以模仿正则表达式引擎中写入\p{X-Confusable=I}的ICU样式。

请注意,您可能还需要考虑UTS#36 UTS#39,ICU SpoofChecker类为您处理。它专门用于URI类型的东西(读取:使用受限字符集的Internet标识符),而不仅仅是任何旧的任意文本。

答案 1 :(得分:4)

是。查看UnicodeData.txt

2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;

答案 2 :(得分:3)

@ dan04的答案是明确问题的正确答案,但间接问题“如果视觉上无法区分的字符具有兼容性等同性”则有更复杂的答案。

通常,规范上等效的字符或字符序列应该看起来相似。粗略地说,它们是与编码字符具有相同直观特征的差异表示。然而,这取决于几个实际考虑,并且渲染可能实际上是不同的。

另一方面,即使字符的渲染(字形)在每种已知字体中都相同,字符在视觉上也难以区分。例如,包含大写拉丁字母A,大写希腊字母alpha和大写西里尔字母A的任何普通字体都有相同的字形,但它们仍然是完全不同的字符,它们之间没有等效映射。

兼容性等效字符在呈现方面可能有所不同,而且它们通常会有所不同,部分原因是它们的差异通常是风格上的。但他们无需区别。