- UTF-8 kóduje body Unicode v 1–4 bajtech, je kompatibilní s ASCII a platný pro jakýkoli jazyk.
- Samosynchronizace a validace: Vzory 0/110/1110/11110 zabraňují překrývání a usnadňují detekci chyb.
- Web a systémy: meta znaková sada, masivní podpora a snadná konverze na Windows/macOS/Linux.
Pokud dnes čtete tento článek a nevidíte žádné podivné symboly, je to díky kódování UTF-8 . Toto kódování umožňuje zobrazení písmen, diakritiky, technických symbolů a dokonce i emoji stejným způsobem v jakémkoli moderním prohlížeči, operačním systému nebo e-mailovém klientovi. Je to nejrozšířenější standard na webu a základ digitální komunikace, jak ji známe.
Když zařízení zobrazuje text, ve skutečnosti zpracovává čísla . Tato čísla jsou kódové body definované standardem Unicode a pro jejich převod na bajty, které putují po síti nebo se ukládají do souboru, provádíme transformaci: UTF-8 . V následujících řádcích pochopíte, co to je, jak to funguje, proč se to stalo standardem, jaké má výhody a omezení a jak se vyhnout běžným chybám.
Co je UTF-8?
UTF-8 (8bitový transformační formát Unicode) je způsob transformace kódových bodů Unicode do bajtových sekvencí . Jeho klíčovou vlastností je, že používá proměnnou délku : některé znaky zabírají 1 bajt, zatímco jiné vyžadují 2, 3 nebo 4 bajty. To umožňuje kompaktní texty s jednoduchými latinskými znaky , ale může také reprezentovat jakýkoli znak z repertoáru Unicode.
Je plně kompatibilní s ASCII : prvních 128 znaků (U+0000 až U+007F) je kódováno jedním bajtem identickým se 7bitovým ASCII. To usnadnilo přechod ze starších systémů a vysvětluje velkou část jeho úspěchu na internetu, v e-mailu a v protokolech IETF.
UTF-8 vyniká svou robustností : obsahuje synchronizační bity, které umožňují spolehlivou identifikaci začátku každého symbolu. Tato vlastnost samosynchronizace usnadňuje detekci, zda sekvence „vypadá“ jako UTF-8 , což je velmi užitečné v nástrojích a parserech.
Unicode: Základ všeho
Unicode je univerzální standard, který každému znaku přiřazuje jedinečné číslo bez ohledu na jazyk, platformu nebo aplikaci. Toto číslo se nazývá kódový bod a obvykle se zapisuje v hexadecimální soustavě ve formátu U+XXXX (nebo více číslic, pokud je potřeba).
Např Velké písmeno „A“ je U+0041V HTML to můžeme také označovat jako A. Váš počítač „nemyslí“ na A jako na písmeno, ale jako na číslo 65.a poté kódování (například UTF-8) rozhodne, jak toto číslo reprezentovat v bajtech.
Pokud chcete vidět, jak se Unicode překládá do znaků na vašem počítači , můžete ve Windows podržet klávesu Alt a zadat desetinný číselný kód na numerické klávesnici: například Alt+65 vrátí „A“ ( úplný seznam kódů Alt naleznete zde ). Je to klasická zkratka, která ukazuje, jak kódy odpovídají znakům, které vidíte.
Trocha historie: jak se zrodil UTF-8
Kódování UTF-8 navrhl Ken Thompson pod vedením Roba Pikea 2. září 1992. Implementovali ho do operačního systému Plan 9 od Bell Labs a oficiálně ho představili na konferenci USENIX (San Diego, leden 1993) . Během standardizace, kterou sponzorovala skupina X/Open Joint Internationalization Group (XOJIG) , byl znám pod názvy jako FSS/UTF a UTF-2, než byl sloučen pod názvem UTF-8.
Návrh řešil praktické problémy , které trápily předchozí pokusy o univerzální kódování: kompatibilitu s ASCII, samosynchronizaci, absenci překrývajících se bajtů a snadnou detekci chyb. Tato rovnováha z něj udělala de facto standard webu.
Jak funguje UTF-8 pod kapotou
UTF-8 seskupuje znaky podle bajtů potřebných k jejich zakódování . Počet bajtů závisí výhradně na kódovém bodu Unicode a řídí se bitovými vzory, které udávají délku sekvence.
- 1 bajt (U+0000 až U+007F): Znaky ASCII. Formát:
0xxxxxxxNejvýznamnější bit je 0, což zaručuje přímou kompatibilitu s ASCII. - 2 bajty (U+0080 až U+07FF): Formát
110yyyyy 10xxxxxx. Používá se pro většinu evropských abeced s diakritikou a další, jako je řečtina, cyrilice, hebrejština nebo arabština.. - 3 bajty (U+0800 až U+FFFF): Formát
1110zzzz 10yyyyyy 10xxxxxx. Zahrnuje vícejazyčný základní plán (BMP) s CJK (čínština, japonština, korejština), technické symboly a nejčastěji používané znaky. - 4 bajty (U+10000 až U+10FFFF): Formát
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. Představuje doplňkové rovinypokročilé matematické symboly, historické spisy, méně běžné ideografické symboly atd.
Klíč k samosynchronizaci spočívá v bitech záhlaví : 0 pro ASCII; 110 pro dva bajty; 1110 pro tři; 11110 pro čtyři. Pokračovací bajty vždy začínají číslicí 10. Díky tomu se pokračovací bajt nikdy nemůže objevit jako počáteční bajt a platná sekvence nikdy nemůže být podřetězcem delší sekvence (princip nepřekrývání).
Ekvivalence s UTF-16 a náhradními páry
UTF-16 představuje kódové body BMP s jednotkou 16 bitů. a body nad U+FFFF s náhradní páry v rozsahu D800–DFFF. Namísto, UTF-8 vždy kóduje skutečné kódové body, nikoli jednotky UTF-16, což zabraňuje záměně s náhradami.
Historicky některé návrhy povolovaly 5 nebo 6 bajtů v UTF-8 pro pokrytí širšího rozsahu, ale Unicode a RFC 3629 omezují UTF-8 na maximálně 4 bajty . ISO/IEC zvažovala širší možnosti, ale ty nejsou součástí současného standardu.
Praktický příklad: ñ
Znak „ñ“ má kód U+00F1., který spadá do dvoubajtového rozsahu. Podle vzoru je kódován jako 110xxxxx 10xxxxxx. Jeho reprezentace UTF-8 je 0xC3 0xB1Dekódování je obrácený proces: čtení užitečných bitů a rekonstrukce původního kódového bodu.
Výhody a omezení UTF-8
Hlavní výhody :
- Podpora ASCIIASCII texty jsou platné v UTF-8 beze změn.
- Univerzální: může představovat libovolný znak Unicode, včetně technických symbolů a emoji.
- Efektivita v latinských textechpři použití 1 bajtu pro ASCII, šetří místo ve srovnání s UTF-16 v mnoha západních jazycích.
- Samosynchronizace a detekcebitové vzory umožňují detekovat začátky znaků a snadno ověřovat sekvence.
Omezení a kompromisy :
- Texty v čínském, čínském a korejském jazyce (CJK) zabírají více místa než texty v UTF-16., kde se mnoho z těchto znaků vejde do 2 pevných bajtů.
- Výpočetní náklady: jelikož má proměnnou délku, některé operace (např. „přejít na znak n“) je nutné projít od začátkua některé úlohy mohou být v kódování UTF-16/UTF-32 rychlejší.
BOM (Byte Order Mark) v UTF-8
UTF-8 nepotřebuje kusovník (BOM). protože pořadí bajtů nemění význam hodnot (minimální jednotkou je bajt). I tak, K dispozici je volitelný kusovník (BOM)., znak U+FEFF kódovaný jako EF BB BF na začátku souboru nebo streamu, což lze použít k označení „toto je Unicode/UTF-8“.
Nejlepší postupy : Pokud se objeví na začátku, některé systémy jej akceptují a jiné s ním zacházejí doslovně. V zřetězeních je vhodné odstranit mezilehlé kusovníky (BOM) . Jeho zahrnutí není povinné a jeho užitečnost v UTF-8 je omezená ve srovnání s UTF-16/UTF-32, kde označuje endianismus.
Typické chyby v kódování a jak se s nimi vypořádat
Robustní dekodér UTF-8 musí buď odmítnout chybně tvarované sekvence , nebo je nahradit znakem U+FFFD (náhradní znak), nebo signalizovat chybu. Nejčastější chyby jsou:
- Zkrácené sekvence: vícebajtový úvodní bajt bez dostatečného pokračování.
- Volné bajty pro pokračování: objevit se
10xxxxxxbez platného úvodního bajtu. - Nadměrné délkykódování s více bajty, než je nutné; například pokus o kódování ASCII s 2 bajty (
0xC0y0xC1jsou neplatné). - Zakázané délky: začne navrhovat 5 nebo 6 bajtů (
0xF8-0xFDnejsou platné ve standardu UTF-8). - Hodnoty mimo rozsah Unicode: není podporováno nad U+10FFFFurčité hodnoty (
0xF5-0xF7jako začátek) jsou neplatné. - Náhradní páry UTF-16:
D800–DFFFnejsou platné kódové body v kódování Unicode; neměly by se zobrazovat kódované v UTF-8.
Pokud se na obrazovce zobrazí znak „�“ , je to s největší pravděpodobností způsobeno neshodou kódování nebo souborem uloženým v jiné kódové stránce. Řešením je vynutit end-to-end kódování UTF-8 (soubor, server, databáze, hlavičky HTTP).
UTF-8 na webu a v e-mailu
HTML stránka musí deklarovat pouze jedno kódování . Doporučené kódování z důvodu kompatibility a rozsahu je UTF-8. Co nejdříve vložte do záhlaví následující meta tag:
<meta charset="UTF-8">
Umístěte jej na začátek tagu `<head>` , aby si jej prohlížeč přečetl před zpracováním dokumentu. Tím se zabrání nekonzistencím a „poškozeným“ znakům. Použití UTF-8 na webu je ohromující ; používá ho drtivá většina současných webových stránek.
V e-mailu je UTF-8 široce podporováno a doporučováno organizacemi, jako je Internet Mail Consortium. Konfigurace e-mailových klientů pro používání UTF-8 snižuje problémy při výměně zpráv s lidmi, kteří mluví jinými jazyky.
UTF-8, UTF-16 a UTF-32: Jaký je mezi nimi rozdíl?
UTF-8 : Kódování s proměnnou délkou v 8bitových jednotkách; ideální pro web , velmi efektivní s ASCII a západními jazyky. Vynikající kompatibilita a detekce chyb.
UTF-16 : proměnná délka v 16bitových jednotkách; používá náhradní páry pro U+10000 a vyšší. Často je výhodné, když převažují znaky jiné než ASCII , a používá se v mnoha API a platformách (například Windows běží nativně v UTF-16 ).
UTF-32 : pevná délka 32 bitů na znak; velmi snadné indexování , ale náročné na prostor. Je vyhrazeno pro případy, kdy je velikost druhoradá vzhledem k jednoduchosti zpracování.
Nekompatibilní varianty: CESU-8 a „Modified UTF-8“
CESU-8 kóduje jednotky UTF-16 přímo (včetně náhradních párů) namísto kódování kódových bodů, čímž se liší od standardního UTF-8 pro znaky nad U+FFFF. Používaly ho některé historické platformy: Oracle 8 jej nabízel pod aliasem UTF-8 a počínaje Oracle 9 přidával standardní UTF-8 pod jiným aliasem. Java a Tcl používaly CESU-8 v určitých kontextech.
Upravená kódování UTF-8 (například v prostředí Java) reprezentuje znak NUL (U+0000) jako 0xC0 0x80 namísto 0x00. Vyhýbá se nulovému bajtu v řetězcích jazyka C , ale není kompatibilní se standardem UTF-8. Mnoho implementací této „upravené“ verze je také kompatibilních s CESU-8.
UTF-8 ve Windows a API: Kódové stránky a konverze
Windows interně pracuje v kódování UTF-16 (WCHAR), ale od Windows 10 verze 1903 můžete vynutit UTF-8 jako kódovou stránku procesu prostřednictvím manifestu aplikace (vlastnost activeCodePage). Díky tomu starší kód, který používá API s rozšířením „-A“, snáze pracuje přes UTF-8.
API -A vs. -W: -A závisí na kódové stránce ANSI nakonfigurováno (může být CP_UTF8), zatímco -W používají UTF-16Pro vzájemnou součinnost, VícebajtovýNaŠirokýZnak y WideCharToMultiByte umožňují převod mezi UTF-8 a UTF-16; Spojené státy americké CP_UTF8 a případně MB_ERR_INVALID_CHARS k detekci vstupních chyb.
UTF-8 je kompatibilní s moderními prohlížeči (Chrome, Firefox, Safari, Edge, Opera a novější verze Internet Exploreru) a většinou operačních systémů (Windows, Linux, macOS, Android, iOS). Pokud nemáte velmi starý software, neměli byste mít žádné problémy.
Jak převést soubory do UTF-8
Ve Windows (Poznámkový blok) : otevřete soubor, přejděte na „Soubor > Uložit jako…“ a v části „Kódování“ vyberte UTF-8 . Pokud chcete zachovat originál, uložte jej pod novým názvem.
V macOS (TextEdit) : V nabídce „TextEdit > Předvolby > Otevřít a uložit“ vyberte při ukládání kódování Unicode (UTF-8) . Poté soubor exportujte s touto volbou povolenou.
V systému Linux: s terminálem můžete použít iconv. Například: iconv -f <codificación_origen> -t UTF-8 <entrada> -o <salida>. Zkontrolovat později že aplikace, která jej spotřebovává, také očekává UTF-8.
Jak poznáte, že je soubor v kódování UTF-8? Mnoho moderních editorů to indikuje ve stavovém řádku. Pokud vidíte podivné znaky jako „�“, poškozené diakritiku nebo nesprávně zobrazené „ñ/ç“, zkontrolujte kódování souboru a nastavení editoru/serveru/databáze.
Dobré postupy, jak se vyhnout překvapením
Deklarujte UTF-8 co nejdříve v hlavičkách HTML a HTTP. Zarovnejte kódování v celém stacku (zdrojové soubory, šablony, databáze a připojení). Vyhněte se míchání kódování na stejné stránce nebo v toku a používejte nástroje, které ověřují/normalizují vstup.
Pro integrace a API, vždy uveďte kódování v záhlavích (Content-Type: application/json; charset=UTF-8, například). Test s vícejazyčnými daty (přízvuky, čínské, čínské a korejské písmo, emoji) k odhalení slabých míst před zahájením produkce.
UTF-8 se ujalo, protože vyvažuje kompatibilitu, efektivitu a dosah . Je to nejpraktičtější způsob, jak zajistit, aby text putoval beze změny napříč kulturami, systémy a aplikacemi, bez ohledu na to, zda obsahuje diakritiku, technické symboly nebo písma, která nejsou latinkou.