ᴇᴅɪᴛ: 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.
"Wizualnie nie do odróżnienia" jest własnością subiektywną. Cokolwiek pierwszy rzymski wyryty w kamieniu nie wyglądało jak Helvetica 1. –