UTF-8 (zkratka pro UCS/Unicode Transformation Format) je jedním ze způsobů kódování znaků, tedy přiřazení číselných kódů znakové sadě (písmenům abecedy a dalším znakům) pro potřeby počítačového zpracování textů. Představuje rozšířený mezinárodní standard dle norem Unicode/ISO/IEC 10646 a dominantní způsob kódování na internetovém webu, který umožňuje ukládat a zobrazovat texty s použitím široké palety světových písem.
Používá proměnnou délku znaku od 1 do 4 bajtů, zatímco standardy UTF-16 a UTF-32 mají pevnou délku 2 a 4 bajty (16 a 32 bitů). Byl navržen pro zpětnou kompatibilitu s ASCII, které obsahuje jen základní sadu anglické abecedy a se kterým má totožný způsob kódování 1bajtových (7bitových) znaků. UTF-8 je definováno v ISO 10646-1:2000 Annex D, v RFC 3629[1] a v Unicode 4.0[2].
Přirozené kódování znaků Unicode/UCS do 2 nebo 4 bajtů se nazývá UCS-2/UTF-16 a UCS-4/UTF-32. Pokud se nespecifikuje jinak, ukládá se nejprve nejvýznamnější bajt (tzv. konvence big-endian). S řetězci uloženými ve formátu UCS-2 nebo UCS-4 je spojeno několik problémů:
Z uvedených důvodů nejsou formáty UCS-2 a UCS-4 vhodné pro ukládání do souborů.
Tyto problémy řeší kódování UTF-8, které má následující vlastnosti:
Každému z více než milionu znaků (písmových i řídicích) je přiřazeno číslo – tzv. kódový bod – a čím je toto číslo vyšší, tím je potřeba k jeho kódování více bajtů. V každém bajtu jsou nejvýznamnější bity příznakové a indikují, kolik bajtů je pro zapsání znaku použito, zatímco zbývajícími bity je zapsán vlastní kód znaku. Pro přepis kódu znaku se používá formát U+XXXX
, kde XXXX je hexadecimální kód znaku, tedy každá číslice (X) šestnáctkové soustavy odpovídají čtyřem bitům (polovině bajtu).
Následující tabulka ukazuje způsob kódování. Pokud je nejvýznamnější bit bajtu 0 (hodnoty 0–127), jedná se o jednobajtový kód dle tabulky ASCII. V ostatních případech jsou rozhodující bity na začátku prvního bajtu: počet jedničkových bitů zakončených nulou (110–11110) odpovídá počtu bajtů sekvence (2–4), ostatní bajty začínají bity 10. Ostatní bity v sekvenci (označené xxx) slouží k vyjádření vlastního kódového bodu (kódu znaku). Počet n těchto bitů určuje (teoretický) počet 2n kódových bodů, tedy znaků, které lze touto sekvencí kódovat.
Počet bajtů | Bajt 1 | Bajt 2 | Bajt 3 | Bajt 4 | Bitů x | Kódových bodů | První kódový bod | Poslední kódový bod | Kódované znaky |
---|---|---|---|---|---|---|---|---|---|
1 | 0xxxxxxx | 7 | 128 | U+0000 | U+007F | ASCII – anglická abeceda a základní znaky | |||
2 | 110xxxxx | 10xxxxxx | 11 | 1920 | U+0080 | U+07FF | Varianty latinky vč. české, další abecedy (řecká, cyrilice, hebrejská, arabská atd.) | ||
3 | 1110xxxx | 10xxxxxx | 10xxxxxx | 16 | 63 tisíc | U+0800 | U+FFFF | Ostatní znaky základní roviny Unicode vč. běžných východoasijských znaků | |
4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 21 | přes milion | U+10000 | U+10FFFF | Ostatní roviny Unicode: méně používané znaky, emoji |
Podle původní definice byl jeden znak v UTF-8 reprezentován jedním až šesti bajty.[3][4] V listopadu 2003 byl rozsah kódů ISO/IEC 10646 omezen na U+10FFFF
kvůli shodnému omezení s UTF-16, RFC 3629 již popisuje UTF-8 s tímto omezením.
Přestože ve výše uvedené tabulce ve sloupci „První kódový bod“ jsou u vícebajtových kódů uvedena nenulová čísla, ve skutečnosti by bylo možné pomocí vícebajtových posloupností kódovat znaky i s nižšími kódy; například znak Euro U+20AC (binárně 0010 0000 1010 1100) v UTF-8 normálně kódovaný třemi bajty (šestnáctkově E2
82
AC
, binárně 11100010
10000010
10101100
) by mohl být kódován čtyřmi bajty F0 82 82 AC
, binárně 11110000
10000010
10000010
10101100
. Norma UTF-8 však takové kódování nazývané anglicky overlong encoding zakazuje.