2012-01-12 7 views
9

Unicode definiuje dwa rodzaje równoważności: 000 równoważność kanoniczną i równoważność kompatybilności. Przykład w Załączniku Technicznym Unicode nr 15 dla równoważności kompatybilności to SUPERSCRIPT ONE (U + 00B9) i DIGIT ONE (U + 0031). Nie omawia postaci, które są wizualnie nieodróżnialne.Czy LATIN CAPITAL LETTER I (U + 0049) i ROMAN NUMERAL ONE (U + 2160) mają równoważność kompatybilności z Unicode?

Jestem ciekawy, czy znaki, które są wizualnie nie do odróżnienia, mają równoważność kompatybilności pod standardem.

Dzięki ..

+1

"Wizualnie nie do odróżnienia" jest własnością subiektywną. Cokolwiek pierwszy rzymski wyryty w kamieniu nie wyglądało jak Helvetica 1. –

Odpowiedz

21

ᴇᴅɪᴛ: Dodany dokładnie co oryginalne pytanie szuka u dołu. To jest naprawdę fajne.


Odpowiedź na pytanie o ʀᴏᴍᴀɴ ɴᴜᴍᴇʀᴀʟ ᴏɴᴇ i ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ jest TAK. Oto szybki sposób sprawdzić:

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

Jednak odpowiedź na pytanie, czy znaki, które są wizualnie nie do odróżnienia mają równoważności zgodności jest zdecydowanie najbardziej NIE!

Na przykład ᴄʜᴇʀᴏᴋᴇᴇ ʟᴇᴛᴛᴇʀ ɢᴏ (Ꭺ) wygląda jak ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (A), ale z pewnością nie jest odpowiednikiem NFKD. Podobnie, gdy ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀʟᴘʜᴀ (Α) i ᴄʏʀɪʟʟɪᴄ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ (А) nie są odpowiednikami NFKD. Istnieje wiele niezliczonych (no, nie mogę ich liczyć) takich problemów. Jedyne punkty kodowe, które są NFKD-equiv do ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴀ, na przykład, są:

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 

Podobnie, oto codepoints które są NFKD równoważnika do ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ szukałeś w:

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 

Zauważ, że nie ma tam ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ,, tak jak jeden przykład.

Nie możesz użyć NFKD, aby znaleźć lookalikes, a niektóre rzeczy, które to equiv dla NKFD nie wyglądają podobnie. Więc nie można tego zrobić w ten sposób w ogólnym przypadku. To nie problem, można nawet zacząć patrzeć bez oglądania rzeczywistych czcionek.

Wierzę, że ICU ma do tego rozszerzoną, niestandardową właściwość, taką jak \p{X-Confusable=A}. W tym celu pobrałem ich pliki danych, ale jeszcze się z tym nie grałem.


Aktualizacja

Okazuje się, że UTS #39, Unicode Security Mechanisms ma dokładnie to, czego szukasz. Jeśli pobierzesz its raw, plaintext datafiles, będziesz mógł określić, które punkty kodowe mogą być ze sobą potencjalnie łączone.

Na przykład w tekście wcześniejszym w tym komunikacie wymieniłem punkty kodowe, które były NFKD równoważne ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ, i wskazałem, że wielu potencjalnych niezgodności nie było w tym zbiorze. Dzieje się tak, ponieważ mapowanie NFKD nie jest zaprojektowane do wykrywania nieporozumień. Jednak pliki danych z UTS # 39 są bardzo zaprojektowane do tego właśnie celu.

Aby ponowić moje ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ɪ wyliczanie, aktualizując go obsługiwać wszystkie punkty kodowe, które UTS 39 uzna za wzajemnie zbliżonej do niej, mamy te, sformatowane przy użyciu unichars i posortowane w kolejności Unicode Collation Algorithm przy użyciu 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 

Ale mimo wszystko jest jeszcze lepiej. Pliki danych obejmują nie tylko jednoklikowe konfuzje, ale także konfuzje, które w niektórych przypadkach mogą wymagać wielu punktów kodowych. Na przykład, oto jeden taki zestaw, tym razem w formacie macierzystym:

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

Czy to nie jest takie napięcie? Jedynym problemem jest to, że jeśli nie korzystasz z klas ICU, będziesz musiał rzucić własną z plików danych UTS # 39.

Ponieważ nie istnieją żadne inne powiązania językowe, o których jestem świadomy, dodałem do mojej listy to, aby utworzyć powiązania Perla w celu naśladowania stylu ICU pisania \p{X-Confusable=I} w silniku regex.

Pamiętaj, że możesz również rozważyć zarówno UTS # 36 i UTS # 39, które klasa ICU SpoofChecker obsługuje. Jest przeznaczony specjalnie dla rzeczy typu URI (czytaj: identyfikatory internetowe, które używają ograniczonego zestawu znaków), a nie tylko dowolny stary dowolny tekst.

3

Odpowiedź przez @ dan04 jest poprawna odpowiedź na wyraźne pytanie, ale pytanie pośrednie „jeśli znaki, które są wizualnie nie do odróżnienia mają równoważności zgodności” ma bardziej skomplikowaną odpowiedź.

Z reguły równoważne kanoniczne znaki lub sekwencje znaków powinny wyglądać podobnie. Są to, mówiąc w przybliżeniu, prezentacje różnicowe o tej samej intuicyjnej postaci, co zakodowane znaki. Zależy to jednak od kilku praktycznych rozważań, a rendering może być inny.

Z drugiej strony, znaki mogą być wizualnie nie do odróżnienia, mimo że ich rendering (glify) są identyczne w każdej znanej czcionce. Na przykład każda normalna czcionka zawierająca wielką łacińską literę A, wielką grecką literę alfa i wielką cyrylicką literę A ma dla nich identyczne glify, ale nadal są one całkowicie odrębnymi znakami, bez odwzorowywania równoważności między nimi.

Znaki równoważności kompatybilności mogą się różnić prezentacją i często tak się dzieje, częściowo dlatego, że ich różnica jest często stylistyczna. Ale nie muszą się różnić.

Powiązane problemy