CESU-8
CESU-8 (zkratka anglického Compatibility Encoding Scheme for UTF-16: 8-bit, Schéma pro kompatibilní kódování UTF-16, 8bitové) je způsob kódování znaků Unicode, který je téměř shodný s UTF-8, ale liší se způsobem práce se znaky od U+10000 výše. Je určen výhradně pro vnitřní použití v systémech, které nejsou schopny dobře pracovat s úplnou znakovou sadou Unicode při použití standardních kódování, není zamýšlen jako formát pro obecnou výměnu dat.
Při kódování do CESU-8 se vstupní text nejprve zakóduje do UTF-16 (tj. znaky mimo Basic Multilingual Plane se zapíší pomocí surrogate pairs), výsledek se poté zakóduje pomocí UTF-8. Znamená to, že kódování znaků BMP (všechny znaky od U+0000 do U+FFFF) je shodné v UTF-8 i CESU-8. Znaky, které jsou v UTF-8 kódovány do čtyř bajtů, jsou však v CESU-8 kódovány pomocí šestibajtové posloupnosti.[1]
CESU-8 je obdobné tzv. Modified UTF-8, které se používá v Javě, tam se ovšem navíc používá speciální kódování znaku U+0000.[2]
V praxi se kódování CESU-8 používá při práci s některými databázemi (Oracle, MySQL), které neumějí pracovat s UTF-8 řetězci reprezentujícími znaky mimo BMP, ale nic nenamítají proti (z hlediska UTF-8 neplatnému) kódování těchto znaků prostřednictvím surrogate pairs, tzn. CESU-8.
V databázovém systému Oracle je od verze 8.0 dostupná znaková sada pojmenovaná UTF8, která však ve skutečnosti reprezentuje právě CESU-8. Až ve verzi 9.0 přibyla podpora „skutečného“ UTF-8, pod názvem AL32UTF8.[3]
Databázový systém MySQL od své verze 4.1 podporuje znakovou sadu utf8, ale jen pro znaky BMP.[4] Znaky mimo BMP nelze do databáze uložit v kódování UTF-8; databáze však nebrání uložení takových znaků pomocí CESU-8, byť tomuto kódování nerozumí a některé funkce u těchto znaků tedy nefungují správně (každý takový znak je např. počítán za dva znaky). Plná podpora UTF-8 (a obecně doplňkových znaků Unicode) se plánuje do připravované verze 5.5.[5]
Příklad kódování
Vstup | U+0045 E | U+0205 ȅ | U+1D53C 𝔼 | |
---|---|---|---|---|
UTF-8 | 45 | C8 85 | F0 9D 94 BC | |
UTF-16 | 0045 | 0205 | D835 | DD3C |
CESU-8 | 45 | C8 85 | ED A0 B5 | ED B4 BC |
Je vidět, že znaky BMP jsou v UTF-8 i CESU-8 kódovány stejně, rozdíl je zde jen ve znaku U+1D53C, který leží mimo BMP.
Reference
- Unicode Technical Report #26: Compatibility Encoding Scheme for UTF-16: 8-bit
- Norbert Lindenberg, Masayoshi Okutsu: Supplementary Characters in the Java Platform, Sun Developer Network, květen 2004
- Oracle® Database Globalization Support Guide 10g Release 2 (10.2) Archivováno 22. 12. 2008 na Wayback Machine, kapitola 6: Supporting Multilingual Databases with Unicode. Part Number B14225-02. Oracle, 2008
- MySQL 5.0 Reference Manual, kapitola 9.1.9: Unicode Support
- MySQL 5.5 Reference Manual, 9.1.10. Unicode Support