Unicode定義了兩種等價的000規範等價和兼容性等價。 Unicode技術附件#15中用於兼容性等效的示例是SUPERSCRIPT ONE(U + 00B9)和DIGIT ONE(U + 0031)。它不討論視覺上難以區分的字符。做拉丁大寫字母I(U + 0049)和羅馬數字一(U + 2160)使用Unicode兼容性等價?
我很好奇,如果是視覺上不可區分的字符有標準下的兼容性等價。
謝謝..
Unicode定義了兩種等價的000規範等價和兼容性等價。 Unicode技術附件#15中用於兼容性等效的示例是SUPERSCRIPT ONE(U + 00B9)和DIGIT ONE(U + 0031)。它不討論視覺上難以區分的字符。做拉丁大寫字母I(U + 0049)和羅馬數字一(U + 2160)使用Unicode兼容性等價?
我很好奇,如果是視覺上不可區分的字符有標準下的兼容性等價。
謝謝..
ᴇᴅɪᴛ:新增究竟一下原來的問題是尋找底部。這真的很酷。
的回答你的問題有關ʀᴏᴍᴀɴɴᴜᴍᴇʀᴀʟᴏɴᴇ和ʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪ是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,其使用受限制的字符集),不是任何舊的任意文本。
是的。看在UnicodeData.txt:
2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
答案通過@ dan04是正確答案明確的問題,而是間接的問題:「如果是視覺上不可區分的字符有兼容性等」有一個更復雜的答案。
作爲一項規則,規範等價的字符或字符序列都應該看起來類似。粗略地說,它們與編碼字符具有相同的直觀字符。然而,這取決於幾個實際考慮因素,並且渲染可能實際上是不同的。
在另一方面,字符可以是視覺上不可區分,即使他們的效果圖(字形)在每一個已知的字體相同。例如,任何正常的字體包含大寫拉丁字母A,資本希臘字母α和資本西裏爾字母A有他們相同的字形,但他們仍然是完全不同的角色,它們之間沒有對等映射。
兼容性相當的字符可能表現有所不同,他們經常這樣做,一方面是因爲它們的區別往往是風格。但他們不需要不同。
「視覺上不可區分」是一個主觀的性質。無論第一個羅馬雕刻成什麼石頭都不像Helvetica 1。 – 2012-01-12 19:52:31