- UTF-8 kóduje body Unicode v 1–4 bajtoch, je kompatibilný s ASCII a platný pre akýkoľvek jazyk.
- Samosynchronizácia a overovanie: Vzory 0/110/1110/11110 zabraňujú prekrývaniu a uľahčujú detekciu chýb.
- Web a systémy: meta znaková sada, masívna podpora a jednoduchá konverzia na Windows/macOS/Linux.
Ak dnes čítate tento článok bez toho, aby ste videli nejaké zvláštne symboly, je to vďaka kódovaniu UTF-8 . Toto kódovanie umožňuje zobrazovanie písmen, diakritiky, technických symbolov a dokonca aj emoji rovnakým spôsobom v akomkoľvek modernom prehliadači, operačnom systéme alebo e-mailovom klientovi. Je to najrozšírenejší štandard na webe a základ digitálnej komunikácie, ako ju poznáme.
Keď zariadenie zobrazuje text, v skutočnosti spracováva čísla . Tieto čísla sú kódové body definované štandardom Unicode a na ich konverziu na bajty, ktoré sa prenášajú sieťou alebo sa ukladajú do súboru, vykonávame transformáciu: UTF-8 . V nasledujúcich riadkoch pochopíte, čo to je, ako to funguje, prečo sa to stalo štandardom, aké sú jeho výhody a obmedzenia a ako sa vyhnúť bežným chybám.
Čo je UTF-8?
UTF-8 (8-bitový transformačný formát Unicode) je spôsob transformácie kódových bodov Unicode na bajtové sekvencie . Jeho kľúčovou vlastnosťou je, že používa variabilnú dĺžku : niektoré znaky zaberajú 1 bajt, zatiaľ čo iné vyžadujú 2, 3 alebo 4 bajty. To umožňuje vytvárať kompaktné texty s jednoduchými latinskými znakmi , ale môže tiež reprezentovať ľubovoľný znak z repertoáru Unicode.
Je plne kompatibilný s ASCII : prvých 128 znakov (U+0000 až U+007F) je kódovaných jedným bajtom identickým so 7-bitovým ASCII. To uľahčilo prechod zo starších systémov a vysvetľuje veľkú časť jeho úspechu na internete, v e-maile a v protokoloch IETF.
UTF-8 vyniká svojou robustnosťou : obsahuje synchronizačné bity, ktoré umožňujú spoľahlivú identifikáciu začiatku každého symbolu. Táto vlastnosť samosynchronizácie uľahčuje detekciu, či sekvencia „vyzerá“ ako UTF-8 , čo je veľmi užitočné v nástrojoch a analyzátoroch.
Unicode: Základ všetkého
Unicode je univerzálny štandard, ktorý každému znaku priraďuje jedinečné číslo bez ohľadu na jazyk, platformu alebo aplikáciu. Toto číslo sa nazýva kódový bod a zvyčajne sa zapisuje v hexadecimálnej sústave vo formáte U+XXXX (alebo viac číslic, ak je to potrebné).
Napr Veľké písmeno „A“ je U+0041V HTML to môžeme označovať aj ako A. Váš počítač „nemyslí“ na A ako na písmeno, ale ako na číslo 65.a potom kódovanie (napríklad UTF-8) rozhodne, ako toto číslo reprezentovať v bajtoch.
Ak chcete vidieť, ako sa Unicode prekladá do znakov na vašom počítači , v systéme Windows môžete podržať kláves Alt a na numerickej klávesnici zadať desatinný číselný kód: napríklad Alt+65 vráti „A“ (pozrite si úplný zoznam kódov Alt ). Je to klasická skratka, ktorá zobrazuje, ako kódy tvoria základ znakov, ktoré vidíte.
Trochu histórie: ako sa zrodil UTF-8
Kódovanie UTF-8 navrhol Ken Thompson pod vedením Roba Pikea 2. septembra 1992. Implementovali ho do operačného systému Plan 9 od spoločnosti Bell Labs a oficiálne ho predstavili na konferencii USENIX (San Diego, január 1993) . Počas štandardizácie, ktorú sponzorovala skupina X/Open Joint Internationalization Group (XOJIG) , bolo známe pod názvami ako FSS/UTF a UTF-2, kým nebolo zlúčené do podoby UTF-8.
Tento návrh vyriešil praktické problémy , ktoré trápili predchádzajúce pokusy o univerzálne kódovanie: kompatibilita s ASCII, samosynchronizácia, žiadne prekrývajúce sa bajty a jednoduchá detekcia chýb. Táto rovnováha z neho urobila de facto štandard webu.
Ako funguje UTF-8 pod kapotou
UTF-8 zoskupuje znaky podľa bajtov potrebných na ich zakódovanie . Počet bajtov závisí výlučne od kódového bodu Unicode a riadi sa bitovými vzormi, ktoré označujú dĺžku sekvencie.
- 1 bajt (U+0000 až U+007F)Znaky ASCII. Formát:
0xxxxxxxNajvýznamnejší bit je 0, čo zaručuje priamu kompatibilitu s ASCII. - 2 bajty (U+0080 až U+07FF): Formát
110yyyyy 10xxxxxx. Používa sa pre väčšinu európskych abecied s diakritikou a ďalšie, ako napríklad gréčtinu, cyriliku, hebrejčinu alebo arabčinu.. - 3 bajty (U+0800 až U+FFFF): Formát
1110zzzz 10yyyyyy 10xxxxxx. Zahŕňa viacjazyčný základný plán (BMP) s CJK (čínština, japončina, kórejčina), technické symboly a najčastejšie používané znaky. - 4 bajty (U+10000 až U+10FFFF): Formát
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. Predstavuje doplnkové roviny: pokročilé matematické symboly, historické spisy, menej bežné ideografické symboly atď.
Kľúč k samosynchronizácii spočíva v hlavičkových bitoch : 0 pre ASCII; 110 pre dva bajty; 1110 pre tri; 11110 pre štyri. Pokračovacie bajty vždy začínajú číslicou 10. Vďaka tomu sa pokračovací bajt nikdy nemôže objaviť ako začiatočný bajt a platná sekvencia nikdy nemôže byť podreťazcom dlhšej sekvencie (princíp neprekrývania).
Ekvivalencia s UTF-16 a náhradnými pármi
UTF-16 predstavuje kódové body BMP s jednotkou 16 bitov a body nad U+FFFF s náhradné páry v rozsahu D800–DFFF. Namiesto toho UTF-8 vždy kóduje skutočné kódové body, nie jednotky UTF-16, čo zabraňuje zámene s náhradami.
Historicky niektoré návrhy povoľovali 5 alebo 6 bajtov v UTF-8 na pokrytie širšieho rozsahu, ale Unicode a RFC 3629 obmedzujú UTF-8 na maximálne 4 bajty . ISO/IEC zvažovala širšie možnosti, ale tie nie sú súčasťou súčasného štandardu.
Praktický príklad: ñ
Znak „ñ“ má kód U+00F1, ktorý spadá do dvojbajtového rozsahu. Podľa vzoru je kódovaný ako 110xxxxx 10xxxxxx. Jeho reprezentácia UTF-8 je 0xC3 0xB1Dekódovanie je opačný proces: čítanie užitočných bitov a rekonštrukcia pôvodného kódového bodu.
Výhody a obmedzenia UTF-8
Hlavné výhody :
- Podpora ASCIIASCII texty sú platné v UTF-8 bez zmien.
- Univerzálny: môže predstavovať ľubovoľný znak Unicode vrátane technických symbolov a emoji.
- Efektívnosť v latinských textochpri použití 1 bajtu pre ASCII, šetrí miesto v porovnaní s UTF-16 v mnohých západných jazykoch.
- Samosynchronizácia a detekciabitové vzory umožňujú rozpoznávanie začiatkov znakov a jednoducho overovať sekvencie.
Obmedzenia a kompromisy :
- Texty v čínsko-japonskom jazyku (CJK) zaberajú viac miesta ako texty v UTF-16, kde sa mnohé z týchto znakov zmestia do 2 pevných bajtov.
- Výpočetné náklady: keďže má premenlivú dĺžku, niektoré operácie (napr. „prejsť na znak n“) treba prejsť od začiatkua niektoré úlohy môžu byť v kódovaní UTF-16/UTF-32 rýchlejšie.
BOM (Byte Order Mark) v UTF-8
UTF-8 nepotrebuje kusovník (BOM) pretože poradie bajtov nemení význam hodnôt (najmenšou jednotkou je bajt). Napriek tomu, K dispozícii je voliteľný kusovník, znak U+FEFF kódovaný ako EF BB BF na začiatku súboru alebo streamu, čo možno použiť na označenie „toto je Unicode/UTF-8“.
Najlepšie postupy : Ak sa objaví na začiatku, niektoré systémy ho akceptujú a iné ho berú doslovne. V zreťazeniach je vhodné odstrániť medziľahlé kusovníky (BOM) . Jeho zahrnutie nie je povinné a jeho užitočnosť v UTF-8 je obmedzená v porovnaní s UTF-16/UTF-32, kde označuje endianizmus.
Typické chyby v kódovaní a ako ich riešiť
Robustný dekodér UTF-8 musí buď odmietnuť chybné sekvencie , alebo ich nahradiť znakom U+FFFD (NÁHRADNÝ ZNAK), alebo označiť chybu. Najčastejšie chyby sú:
- Skrátené sekvencie: viacbajtový úvodný bajt bez dostatočného počtu pokračovaní.
- Voľné bajty pokračovania: objaviť sa
10xxxxxxbez platného úvodného bajtu. - Nadmerné dĺžkykódovanie s väčším počtom bajtov, ako je potrebné; napríklad pokus o kódovanie ASCII s 2 bajtmi (
0xC0y0xC1sú neplatné). - Zakázané dĺžky: začne navrhovať 5 alebo 6 bajtov (
0xF8-0xFDnie sú platné v štandarde UTF-8). - Hodnoty mimo rozsahu Unicode: nie je podporované nad U+10FFFFurčité hodnoty (
0xF5-0xF7ako začiatky) sú neplatné. - Náhradné páry UTF-16:
D800–DFFFnie sú platné kódové body v kódovaní Unicode; nemali by sa zobrazovať kódované v kódovaní UTF-8.
Keď sa na obrazovke zobrazí znak „�“ , s najväčšou pravdepodobnosťou je to spôsobené nesúladom kódovania alebo súborom uloženým v inej kódovej stránke. Riešením je vynútiť kódovanie UTF-8 od začiatku do konca (súbor, server, databáza, hlavičky HTTP).
UTF-8 na webe a v e-maile
HTML stránka musí deklarovať iba jedno kódovanie . Odporúčané kódovanie z dôvodu kompatibility a rozsahu je UTF-8. Čo najskôr vložte do hlavičky nasledujúcu metaznačku:
<meta charset="UTF-8">
Umiestnite ho na začiatok značky `<head>` , aby si ho prehliadač prečítal pred spracovaním dokumentu. Tým sa zabráni nekonzistentnostiam a „poškodeným“ znakom. Prijatie UTF-8 na webe je ohromujúce ; používa ho prevažná väčšina súčasných webových stránok.
V e-mailoch je UTF-8 široko podporované a odporúčané organizáciami ako Internet Mail Consortium. Konfigurácia e-mailových klientov na používanie UTF-8 znižuje problémy pri výmene správ s ľuďmi, ktorí hovoria inými jazykmi.
UTF-8, UTF-16 a UTF-32: Aký je medzi nimi rozdiel?
UTF-8 : Kódovanie s premenlivou dĺžkou v 8-bitových jednotkách; ideálne pre web , veľmi efektívne s ASCII a západnými jazykmi. Vynikajúca kompatibilita a detekcia chýb.
UTF-16 : variabilná dĺžka v 16-bitových jednotkách; používa náhradné páry pre U+10000 a vyššie. Často je výhodné, keď prevládajú znaky iné ako ASCII , a používa sa v mnohých API a platformách (napríklad Windows beží natívne v UTF-16 ).
UTF-32 : pevná dĺžka 32 bitov na znak; veľmi jednoduché indexovanie , ale náročné na miesto. Je vyhradené pre prípady, keď je veľkosť druhoradá vzhľadom na jednoduchosť spracovania.
Nekompatibilné varianty: CESU-8 a „Modified UTF-8“
CESU-8 kóduje jednotky UTF-16 priamo (vrátane náhradných párov) namiesto kódovania kódových bodov, čím sa líši od štandardného UTF-8 pre znaky nad U+FFFF. Používali ho niektoré historické platformy: Oracle 8 ho ponúkal pod aliasom UTF-8 a počnúc Oracle 9 pridával štandardný UTF-8 pod iným aliasom. Java a Tcl používali CESU-8 v určitých kontextoch.
Modifikovaná kódová značka UTF-8 (napríklad v prostredí Java) reprezentuje znak NUL (U+0000) ako 0xC0 0x80 namiesto 0x00. V reťazcoch jazyka C sa týmto spôsobom vyhýba nulovému bajtu , ale nie je kompatibilná so štandardom UTF-8. Mnohé implementácie tejto „modifikovanej“ verzie sú tiež kompatibilné s normou CESU-8.
UTF-8 v systéme Windows a API: Kódové stránky a konverzia
Windows interne pracuje v kódovaní UTF-16 (WCHAR), ale od verzie Windowsu 10 1903 môžete vynútiť UTF-8 ako kódovú stránku procesu prostredníctvom manifestu aplikácie (vlastnosť activeCodePage). Vďaka tomu je pre starší kód, ktorý používa API s kódovaním „-A“, jednoduchšie pracovať s UTF-8.
API -A vs -W: -A závisia od kódovej stránky ANSI nakonfigurovaný (môže byť CP_UTF8), zatiaľ čo -W využívajú UTF-16Pre vzájomnú spoluprácu, ViacbajtovýNaŠirokýZnak y ŠirokýZnakNaViacBajt umožňujú konverziu medzi UTF-8 a UTF-16; Spojené štáty americké CP_UTF8 a ak je to relevantné, MB_ERR_INVALID_CHARS na detekciu vstupných chýb.
UTF-8 je kompatibilné s modernými prehliadačmi (Chrome, Firefox, Safari, Edge, Opera a novšie verzie Internet Exploreru) a väčšinou operačných systémov (Windows, Linux, macOS, Android, iOS). Pokiaľ nemáte veľmi starý softvér, nemali by ste mať žiadne problémy.
Ako previesť súbory do UTF-8
Vo Windowse (Poznámkový blok) : otvorte súbor, prejdite na „Súbor > Uložiť ako…“ a v časti „Kódovanie“ vyberte UTF-8 . Ak chcete zachovať originál, uložte ho s novým názvom.
V systéme macOS (TextEdit) : V časti „TextEdit > Predvoľby > Otvoriť a uložiť“ vyberte pri ukladaní kódovanie Unicode (UTF-8) . Potom exportujte súbor s touto možnosťou povolenou.
V systéme Linux: s terminálom, ktorý môžete použiť iconv, Napríklad: iconv -f <codificación_origen> -t UTF-8 <entrada> -o <salida>. Skontrolovať neskôr že aplikácia, ktorá ho spotrebúva, tiež očakáva UTF-8.
Ako zistíte, či je súbor v kódovaní UTF-8? Mnoho moderných editorov to indikuje v stavovom riadku. Ak vidíte zvláštne znaky ako „�“, poškodené diakritiku alebo nesprávne zobrazené „ñ/ç“, skontrolujte kódovanie súboru a nastavenia editora/servera/databáze.
Osvedčené postupy, ako sa vyhnúť prekvapeniam
Deklarujte UTF-8 čo najskôr v hlavičkách HTML a HTTP. Zarovnajte kódovanie v celom zásobníku (zdrojové súbory, šablóny, databáza a pripojenie). Vyhnite sa miešaniu kódovaní na tej istej stránke alebo v toku a používajte nástroje, ktoré overujú/normalizujú vstup.
Pre integrácie a API, vždy uveďte kódovanie v hlavičkách (Content-Type: application/json; charset=UTF-8, napríklad). Test s viacjazyčnými údajmi (prízvuky, čínske, japonské a korejské písmo, emoji) na odhalenie slabých miest pred produkciou.
UTF-8 prevládala, pretože vyvažuje kompatibilitu, efektívnosť a dosah . Je to najpraktickejší spôsob, ako zabezpečiť, aby sa text prenášal neporušený naprieč kultúrami, systémami a aplikáciami bez ohľadu na to, či obsahuje diakritiku, technické symboly alebo iné písma ako latinka.