2012-01-12 4 views
9

Unicodeは、000種類の等価性と互換性の同等性を定義します。互換性の同等性に関するUnicode Technical Annex#15の例は、SUPERSCRIPT ONE(U + 00B9)とDIGIT ONE(U + 0031)です。視覚的に区別できない文字については説明しません。LATIN CAPITAL LETTER I(U + 0049)とROMAN NUMERAL ONE(U + 2160)はユニコード互換性がありますか?

視覚的に見分けがつかない文字が標準の下で互換性がある場合は、私は興味があります。

おかげ..

+1

「視覚的に区別できない」は主観的な性質です。石に刻まれた最初のローマが何であれ、Helvetica 1のようには見えませんでした。 –

答えて

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 

この例では、ɢʀᴇᴇᴋᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪ'sはありません。

ルックアライメントを見つけるのにNFKDを使用することはできません。ですNKFD equivはよく似ていません。一般的なケースではそうすることはできません。実際のフォントを見ずに見ることができるのは問題ではありません。

ICUには、\p{X-Confusable=A}のような拡張された非標準的なプロパティがあります。私はこれのために彼らのデータファイルをダウンロードしましたが、まだそれとずっと遊んでいません。


更新

それはUTS #39, Unicode Security Mechanismsは、あなたが探している正確に何を持っていることが判明しました。 its raw, plaintext datafilesを取得すると、潜在的に混乱しているコードポイントを特定することができます。

たとえば、このメッセージの前半のテキストでは、NFKDと同等のコードポイントをʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪと列挙し、潜在的な混乱の可能性がないことを指摘しました。これは、NFKDマッピングが混乱を検出するように設計されていないためです。しかし、UTS#39のデータファイルは、その目的のためだけに設計されています。

unicharsを使用してフォーマットしてucsortを使用してUnicode照合アルゴリズムの順にソートし、それとの相互紛らわしい#39と見なしをUTSすべてのコード・ポイントを処理するためにそれを更新し、私たちはこれらを持って、私のʟᴀᴛɪɴᴄᴀᴘɪᴛᴀʟʟᴇᴛᴛᴇʀɪ列挙をやり直す:

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データファイルから自分自身をロールバックする必要があります。

私が知っている他の言語バインディングはないので、私は正規表現エンジンで\p{X-Confusable=I}を書くというICUスタイルを模倣するPerlバインディングを作成するために私のリストに追加しました。

ICU SpoofCheckerクラスが扱うUTS#36 UTS#39の両方を検討することもできます。これは特に、任意の古い任意のテキストだけでなく、URI型のもの(読まれた:制限付き文字セットを使用するインターネット識別子)を対象としています。

4

はい。 UnicodeData.txtに見て:

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

@ dan04によって答えは明示的な質問に対する正しい答えではなく、間接的な質問「を視覚的に区別できない文字は、互換性の等価性を持っている場合は、」より複雑な答えを持っています。

通常、正規の文字または文字シーケンスは類似しているはずです。大まかに言えば、エンコードされた文字と同じ直感的な文字の差異表現です。しかしこれはいくつかの実用的な考慮事項に依存しており、レンダリングは実際には異なるかもしれません。

一方、文字は、既知のフォントごとにレンダリング(グリフ)が同じであっても視覚的に区別できない場合があります。たとえば、大文字のラテン文字A、大文字のギリシャ文字アルファ、および大文字のキリル文字Aを含む通常のフォントはすべて同じ文字を持っていますが、それらは等価なマッピングを持たず完全に別の文字です。

互換性同等の文字はプレゼンテーションが異なる場合があり、その違いはしばしば文体的であることが多いためです。しかし、彼らは異なっている必要はありません。

関連する問題