2012-01-12 15 views
9

Unicode定義了兩種等價的000規範等價和兼容性等價。 Unicode技術附件#15中用於兼容性等效的示例是SUPERSCRIPT ONE(U + 00B9)和DIGIT ONE(U + 0031)。它不討論視覺上難以區分的字符。做拉丁大寫字母I(U + 0049)和羅馬數字一(U + 2160)使用Unicode兼容性等價?

我很好奇,如果是視覺上不可區分的字符有標準下的兼容性等價。

謝謝..

+1

「視覺上不可區分」是一個主觀的性質。無論第一個羅馬雕刻成什麼石頭都不像Helvetica 1。 – 2012-01-12 19:52:31

回答

21

ᴇᴅɪᴛ:新增究竟一下原來的問題是尋找底部。這真的很酷。


的回答你的問題有關ʀᴏᴍᴀɴɴᴜᴍᴇʀᴀʟᴏɴᴇ和ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪ是YES。這裏有一個快速的方法來檢查:

$ 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-當量的唯一代碼點ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀᴀ,例如有:

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 

注意這裏沒有ɢʀᴇᴇᴋᴄᴀᴘᴛᴀʟᴛᴀʟʟᴇᴛᴛᴇʀɪjust,就像一個例子。

你不能使用NFKD找到lookalikes,有些東西 NKFD equiv看起來不太相似。所以在一般情況下你不能那樣做。這不是一個問題,你甚至可以開始看,而不看實際的字體。

我相信ICU具有延長,非標屬性這一點,像\p{X-Confusable=A}。我爲此下載了他們的數據文件,但還沒有玩過它。


更新

事實證明,UTS #39, Unicode Security Mechanisms,有你在尋找什麼。如果您獲取its raw, plaintext datafiles,您將能夠確定哪些代碼點可能與另一個潛在混淆。

例如,在本文前面的文字中,我列舉了NFKD等價於ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪ的代碼點,並指出該集合中缺少許多潛在的混淆因素。這是因爲NFKD映射的目的不是爲了檢測易混淆物。但是,來自UTS#39的數據文件非常符合這個目的。

要重做我ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪ枚舉,更新它使用ucsort來處理UTS#39認爲相互與之混淆,我們這些所有的代碼點,使用unichars格式化並分類保存在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數據文件中推出自己的課程。

由於沒有其他語言綁定,我知道,我已經添加到我的列表中創建Perl綁定,以模仿在正則表達式引擎中編寫\p{X-Confusable=I}的ICU樣式。

請注意,您也不妨同時考慮UTS#36 UTS#39,其中ICU SpoofChecker類爲你處理。這是專門爲URI類的東西(讀:互聯網identifers,其使用受限制的字符集),不是任何舊的任意文本。

3

答案通過@ dan04是正確答案明確的問題,而是間接的問題:「如果是視覺上不可區分的字符有兼容性等」有一個更復雜的答案。

作爲一項規則,規範等價的字符或字符序列都應該看起來類似。粗略地說,它們與編碼字符具有相同的直觀字符。然而,這取決於幾個實際考慮因素,並且渲染可能實際上是不同的。

在另一方面,字符可以是視覺上不可區分,即使他們的效果圖(字形)在每一個已知的字體相同。例如,任何正常的字體包含大寫拉丁字母A,資本希臘字母α和資本西裏爾字母A有他們相同的字形,但他們仍然是完全不同的角色,它們之間沒有對等映射。

兼容性相當的字符可能表現有所不同,他們經常這樣做,一方面是因爲它們的區別往往是風格。但他們不需要不同。

相關問題