Text a kód / Návody

Kódové body Unicode, bajty UTF-8 a normalizácia

Znak na obrazovke, kódový bod Unicode a uložený bajt spolu súvisia, ale nie sú rovnakou jednotkou textu.

Tri vrstvy textovej hodnoty

Človek vidí text, niekedy vrátane znamienka spojeného s predchádzajúcim písmenom. Unicode priraďuje abstraktným znakom kódové body a kódovanie, napríklad UTF-8, mení tieto body na bajty pre uloženie alebo prenos. Jeden viditeľný znak môže zahŕňať viac kódových bodov a jeden bod môže zabrať viac bajtov UTF-8. Počet bajtov preto nie je automaticky počtom písmen ani znakov vnímaných používateľom. Nástroj text na kódové body ukazuje hodnoty Unicode v reťazci; text na bajty UTF-8 ukazuje inú vrstvu. Tieto pohľady pomáhajú diagnostikovať rozdiel, nemožno ich však bez znalosti kódovania príjemcu voľne zamieňať.

Dva zápisy slova café

Viditeľné slovo café sa môže končiť jediným kódovým bodom U+00E9, LATIN SMALL LETTER E WITH ACUTE. To je zložená podoba. Môže sa končiť aj bodom U+0065 pre obyčajné e a za ním bodom U+0301 pre kombinujúci dĺžeň. Druhá podoba má o jeden kódový bod viac, hoci text často vyzerá rovnako. V UTF-8 má zložené slovo hexadecimálne bajty 63 61 66 C3 A9; rozložené slovo 63 61 66 65 CC 81. Sú to rozdielne sekvencie bajtov, takže presné porovnanie alebo hash sa môžu líšiť. NFC tento príklad zmení na zloženú sekvenciu, NFD na rozloženú. Vložený prevodník ukazuje tieto bajty desiatkovo: 99 97 102 195 169 pri zloženej a 99 97 102 101 204 129 pri rozloženej podobe. Porovnajte ich s hexadecimálnym zápisom vyššie.

Jedno viditeľné slovo môže mať dve sekvencie Unicode a bajtov.
  1. café: U+00E9 → koniec C3 A9
  2. café: U+0065 U+0301 → koniec 65 CC 81
  3. NFC ⇢ zložené · NFD ⇢ rozložené

Čo normalizácia robí a nerobí

Normalizácia Unicode určuje spôsoby zápisu kanonicky ekvivalentných sekvencií. NFC po rozložení vykoná kanonické zloženie, zatiaľ čo NFD ponechá kanonicky rozloženú sekvenciu. Pomáha to pri porovnávaní textu z rôznych klávesníc, súborov alebo systémov. Neprekladá slová, neodstraňuje diakritiku a nezaručuje rovnosť všetkých vizuálne podobných reťazcov. Niektoré podobné znaky pochádzajú z rôznych písiem alebo majú iný význam. Kompatibilné formy NFKC a NFKD môžu meniť aj širšie rozdiely v zápise, preto ich vyberte len vtedy, ak to účel dovoľuje. Pri porovnávaní, indexovaní a hashovaní uplatňujte rovnaké pravidlo normalizácie; inak sa podobne vyzerajúce vstupy stále rozídu.

Spoľahlivý postup pri hľadaní chyby

Keď sa meno nezhoduje, najprv si uchovajte pôvodný vstup. Pozrite jeho kódové body: je prízvuk súčasťou predzloženého znaku alebo samostatným kombinujúcim znamienkom za písmenom? Potom skontrolujte bajty UTF-8, ktoré skutočne prejdú cez API alebo sa zapíšu do súboru. Kópie normalizujte na NFC a NFD, porovnajte výsledné body a pomocou opačného prevodníka bajtov UTF-8 overte platnosť a očakávané dekódovanie. Pri výmene súborov zaznamenajte použité kódovanie výslovne, nespoliehajte sa na predvolenú voľbu každého programu. Náhradný znak často signalizuje problém pri dekódovaní; normalizácia už nesprávne dekódovaného reťazca stratené pôvodné bajty neobnoví.

Zvoľte správne porovnanie

Pri presnej integrite súboru, hashoch a podpisoch rozhodujú bajty: iná normalizácia zmení bajty, a teda aj odtlačok. Pri vyhľadávaní pre používateľov alebo hľadaní duplicít môže produkt normalizovať vopred, ale toto pravidlo má vysvetliť a otestovať. Veľkosť písmen, interpunkcia, medzery a jazykovo závislé triedenie sú samostatné otázky; NFC ich nevyrieši. Pri zobrazovaní alebo exporte potichu nemeňte zápis používateľa, ak to postup nevyžaduje. V nástrojoch nižšie začnite slovom café a prezrite jeho bajty UTF-8. Potom vložte podobu napísanú ako e s kombinujúcim znamienkom do nástrojov kódových bodov a normalizácie. Uvidíte, na ktorej vrstve sa objaví nenápadný vizuálny rozdiel. Ak spracúvate viac súborov, napíšte do importného postupu aj pravidlo, kedy sa normalizuje: pred porovnaním, pred indexovaním alebo až pri zobrazení. Rovnaké pravidlo potom otestujte na pôvodnom aj kombinovanom zápise. Len tak sa rozdiel nevráti v ďalšom kroku aplikácie. Pri presnom archivačnom uložení uchovajte aj pôvodný reťazec.

Vyskúšať konvertor

Prezrite si bajty UTF-8 slova café a potom skúste e s kombinujúcim znamienkom.

UTF-8 serializuje text Unicode na bajty; ASCII potrebuje jeden bajt, mnohé ďalšie znaky dva až štyri. Preveďte údaje lokálne v prehliadači.

Otvoriť celý konvertor

Ďalšie návody

Návody na konverzie

Prezrieť návody