UTF-8

Z Multimediaexpo.cz

UTF-8 je zkratka pro UCS Transformation Format. Je to způsob kódování řetězců znaků Unicode/UCS do sekvencí bajtů. Varianta UTF-16 kóduje řetězce do posloupností 16bitových slov (2 bajty), Varianta UTF-32 do 32 bitových slov (4 bajty). UTF-8 je definováno v ISO 10646-1:2000 Annex D, v RFC 3629 a v Unicode 4.0.

Obsah

Důvody vzniku, základní vlastnosti

Přirozené kódování znaků Unicode/UCS do 2 nebo 4 bajtů se nazývá UCS-2 a UCS-4. 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ů:

  • Uložení textu je několikanásobně náročnější na paměť.
  • Některé bajty v řetězci mohou obsahovat binární nuly, které mají zvláštní význam v některých programovacích jazycích.
  • Některé bajty mohou obsahovat znaky, které mají zvláštní význam pro operační systém (např. „/“, „\“).

Z uvedených důvodů není formát UCS-2 a UCS-4 vhodný pro ukládání řetězců do souborů.

Tyto problémy řeší kódování UTF-8, které má následující vlastnosti:

  • UCS znaky U+0000 až U+007F jsou kódovány jednoduše jako bajt 0x000x7F. To znamená, že řetězce obsahující pouze ASCII znaky mají shodné kódování v UTF-8 i v ASCII.
  • Všechny znaky větší než U+007F jsou kódovány jako sekvence několika bajtů, z nichž každý má nastaven nejvyšší bit na jedničku. To znamená, že bajty nemohou být zaměněny s žádným ASCII znakem.
  • První bajt sekvence, která reprezentuje ne-ASCII znak, je vždy v rozsahu 0xC00xFD a určuje, kolik bajtů následuje. Všechny následující znaky sekvence jsou v rozsahu 0x800xBF. To umožňuje snadnou synchronizaci a odolnost proti ztrátě některých bajtů.
  • Může být kódován celý rozsah UCS 231.
  • Zakódované znaky mohou být až 6 bajtů dlouhé, ale základní 16bitové znaky BMP (basic multilingual plane) jsou jen 1 až 3 bajty dlouhé.
  • Pořadí big-endian (nejvýznamnější byte ukládán jako první) je zachováno.
  • Bajty s hodnotou 0xFE a 0xFF nejsou nikdy použity.

Způsob kódování znaků

Následující tabulka ukazuje způsob kódování. Pozice bitů „xxx“ jsou vyplněny bity kódu znaku, vpravo jsou nejméně významné bity. Pro kód znaku musí být použita nejkratší možná sekvence bajtů. Počet bitů v prvním bajtu ve vícebajtové sekvenci odpovídá počtu bajtů sekvence.

U+00000000 - U+0000007F 0xxxxxxx
U+00000080 - U+000007FF 110xxxxx 10xxxxxx
U+00000800 - U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 - U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U+00200000 - U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U+04000000 - U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

BOM

Sekvence bajtů (hexadec)Kódování
00 00 FE FF UTF-32 big-endian
FF FE 00 00 UTF-32 little-endian
FE FF UTF-16 big-endian
FF FE UTF-16 little-endian
EF BB BF UTF-8

Znak s kódem U+FEFF (v desítkové soustavě 65279) se nazývá BOM (Byte-Order Mark, česky přibližně „označení pořadí bajtů“), někdy také „UTF signatura“. V kódování UTF-8 je tento znak reprezentován trojicí bajtů 0xEF 0xBB 0xBF, v kódování UTF-16 big-endian dvojicí bajtů 0xFE 0xFF a v UTF-16 little-endian 0xFF 0xFE. Grafický význam znaku je „nedělitelná mezera nulové šířky“ (zero-width no-break space), je tak podobný znaku U+2060 (word joiner). [1]

Hlavním důvodem užití tohoto znaku je rozlišení pořadí ukládání bajtů big-endian nebo little-endian v UTF-16 a odlišení samotného UTF-16 od UTF-8. V případě záměny pořadí bajtů není znak U+FFFE platný Unicode znak, navíc v kódování UTF-8 se bajty 0xFE a 0xFF nesmí vyskytovat. Užití BOM v UTF-8 je pro účel rozpoznání pořadí ukládání bajtů nadbytečné, nicméně množství aplikací operačního systému Microsoft Windows používá tento znak na začátku souboru pro rozlišení souborů uložených ve formátu UTF-8. V některých systémech (POSIX) není tato signatura používána a může být zdrojem problémů.

Související články