2012-01-12 6 views
9

Unicode definisce due tipi di equivalenza 000 equivalenza canonica e equivalenza di compatibilità. L'esempio in Unicode Technical Annex # 15 per l'equivalenza di compatibilità è SUPERSCRIPT ONE (U + 00B9) e DIGIT ONE (U + 0031). Non discute i personaggi che sono visivamente indistinguibili.Do LETIN CAPITAL LETTER I (U + 0049) e ROMAN NUMERAL ONE (U + 2160) hanno l'equivalenza di compatibilità Unicode?

Sono curioso di sapere se i caratteri visivamente indistinguibili hanno equivalenza di compatibilità secondo lo standard.

Grazie ..

+1

"Visivamente indistinguibile" è una proprietà soggettiva. Qualunque sia stata la prima pietra romana scolpita nella pietra non sembrava una Helvetica 1. –

risposta

21

ᴇᴅɪᴛ: Aggiunto esattamente ciò che la domanda iniziale è alla ricerca di in fondo. Questo è davvero bello.


La risposta alla tua domanda circa ʀᴏᴍᴀɴ ɴᴜᴍᴇʀᴀʟ ᴏɴᴇ e ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ è SI. Ecco un modo veloce per controllare:

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

Tuttavia, la risposta alla tua domanda se i caratteri che sono visivamente indistinguibili hanno compatibilità equivalenza è sicuramente NO!

Ad esempio, ᴄʜᴇʀᴏᴋᴇᴇ ʟᴇᴛᴛᴇʀ ɢᴏ (Ꭺ) assomiglia a ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (A), ma non è certamente equivalente NFKD. Similmente con ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀʟᴘʜᴀ (Α) e ᴄʏʀɪʟʟɪᴄ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (А) non sono equivalenti NFKD. Ci sono in realtà molti (non li posso contare :) di questi problemi. Gli unici punti di codice che sono NFKD-equiv per ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ, per esempio, sono:

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 

Allo stesso modo, qui i codepoints che sono equiv NFKD al ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ stavi guardando:

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 

Avviso non c'è ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪᴏᴛᴀ lì, proprio come un esempio.

Non è possibile utilizzare NFKD per trovare i sosia, e alcune cose che sono NKFD equiv non sembrano molto simili. Quindi non puoi farlo in questo modo nel caso generale. Non è un problema si può anche cominciare a guardare senza guardare i veri caratteri.

Credo che ICU abbia una proprietà estesa e non standard per questo, come \p{X-Confusable=A}. Ho scaricato i loro file di dati per questo, ma non ci ho ancora giocato molto.


Aggiornamento

Si scopre che UTS #39, Unicode Security Mechanisms, ha esattamente quello che stai cercando. Se recuperi its raw, plaintext datafiles, sarai in grado di determinare quali punti di codice sono potenzialmente confondibili l'uno con l'altro.

Ad esempio, nel testo precedente in questo messaggio, ho enumerato i punti di codice che erano NFKD equivalenti a ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ, e ho sottolineato che molti potenziali elementi confusibili mancavano da quel set. Questo perché la mappatura NFKD non è progettata per rilevare i confondibili. Tuttavia, i file di dati di UTS # 39 sono progettati proprio per questo scopo.

di rifare la mia ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ enumerazione, aggiornandolo a gestire tutti i punti di codice che UTS # 39 Deems reciprocamente confondibile con esso, abbiamo queste, formattati utilizzando unichars e ordinati in ordine di Unicode Collation Algorithm utilizzando 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 

Nifty anche se è, diventa ancora meglio. I file di dati includono non solo i confusibili con un singolo punto di codice, ma anche i confusi che in alcuni casi potrebbero richiedere più punti di codice. Ad esempio, ecco uno di questi set, questa volta in formato nativo del file:

#  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  # →С̡→ 

Non è vero? L'unico problema è che, a meno che non si utilizzino le classi ICU, è necessario eseguire il rollover dai file di dati UTS # 39.

Poiché non vi sono altri collegamenti di lingua di cui sono a conoscenza, ho aggiunto alla mia lista to per creare associazioni Perl per imitare lo stile di scrittura ICU \p{X-Confusable=I} nel motore regex.

Si noti che si può anche prendere in considerazione sia UTS n. 36 e UTS n. 39, che la ICU SpoofChecker gestisce per te. È specifico per le cose di tipo URI (leggi: identificatori di Internet, che utilizzano un set di caratteri limitato), non solo qualsiasi vecchio testo arbitrario.

4

Sì. Cerca in UnicodeData.txt:

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

La risposta da @ dan04 è la risposta corretta alla domanda esplicita, ma la domanda indiretta “se i caratteri che sono visivamente indistinguibili hanno compatibilità equivalenza” ha una risposta più complicata.

Come regola generale, i caratteri canonicamente equivalenti o le sequenze di caratteri devono apparire simili. Sono, grosso modo, presentazioni di differenze con lo stesso carattere intuitivo dei caratteri codificati. Ciò tuttavia dipende da diverse considerazioni pratiche e le rappresentazioni potrebbero infatti essere diverse.

D'altra parte, i caratteri possono essere visivamente indistinguibili anche se i loro rendering (glifi) sono identici in ogni font conosciuto. Ad esempio, qualsiasi carattere normale che contiene la lettera maiuscola A maiuscola, la lettera maiuscola alfa maiuscola e la lettera cirillica A maiuscola hanno glifi identici per loro, ma sono ancora caratteri completamente distinti, senza alcuna corrispondenza di equivalenza tra di essi.

I caratteri equivalenti di compatibilità possono differire nella presentazione, e spesso lo fanno, in parte perché la loro differenza è spesso stilistica. Ma non hanno bisogno di differenze.

Problemi correlati