Archiv pro štítek: Unicode

UTF-16 a binární reprezentace

Následující článek navazuje na velmi podobný text, jenž popisoval převod do dvojkové soustavy v rámci kódování UTF-8. Z mého pohledu se transformace do binární reprezentace u UTF-16 provádí ještě jednodušeji než v případě UTF-8.

Převádět budu slovo řepa a neobejdu se pochopitelně bez Unicode tabulky. Nejprve vyhledám znak ř. Dozvídám se hodnotu 15916 a ihned si spočítám podobu v dvojkové soustavě – 1 0101 10012. Nyní nastává fáze samotného kódování do UTF-16. S pomocí níže zobrazených pravidel nacházejících se například na Wikipedii určím počet dostupných bitů. Vkládat mohu pouze na místa označená jako x.

 UTF-16

Především si povšimněte, že v případě dvou bajtů ve své podstatě zapisuji pouze samotný binární kód. Teprve v případě čtyř bajtů nastupuje určitá forma režie. Písmeno ř tedy v UTF-16 vypadá takto – 0000000101011001 2. Pro přehlednost a kratší zápis lze provést převod do šestnáctkové soustavy. Jak však patrně již správně tušíte, výsledek vypadá shodně jako zápis ř v Unicode, tedy 015916. Obdobně postupuji i u dalších zbývajících znaků:

  • ř – 0000000101011001 2015916
  • e – 0000000001100101 2006516
  • p – 0000000001110000  2007016
  • a – 0000000001100001  2006116

 K ověření doporučuji následující nástroj.

Endianita

Pro zajímavost dále uvedu, že UTF-16 v sobě nese informaci o použité endianitě. K tomuto účelu se využívá BOM (byte order mark). Existují dvě varianty:

  • big-endian – Na nejnižší adresu se ukládá nejvýznamnější bit. Následují další bity až po ten nejméně významný. V paměti proto nejprve narazíme na nejvýznamnější bit.
  • little-endian – Nejnižší adresa obsahuje nejméně významný bit. Následující narůstající paměťové buňky slouží k ukládání bitů směrem k tomu nejvýznamnějšímu.

Číslo 0xAABBCCDD tedy bude uloženo následovně:

  • big-endianAA BB CC DD
  • little-endianDD CC BB AA

UTF-8 a binární i hexadecimální reprezentace

UTF-8 a binární i hexadecimální reprezentaceNásledující text pokrývá problematiku převodu textu do binární podoby v rámci kódování UTF-8. Pakliže toužíte vědět, jak výsledná informace vypadá, jste na správné adrese.

K převodu použiji krátké české slovo řepa. To se skládá ze čtyř znaků, což značí i počet nahlédnutí do Unicode tabulky. Zaměřím se přitom na hexadecimální formát. V případě ř se dozvídám údaj 15916, jenž transformuji do binární podoby 1 0101 1001 2. Nyní je třeba určit, kolik bajtů potřebuji k uložení. Jak patrně víte, jeden bajt uchová 8 bitů. V mém případě však binární číslo čítá 9 bitů. O slovo se však hlásí i určitá režie, jenž pomáhá identifikovat počet bajtů dané sekvence. Ke specifikování volného prostoru poslouží níže zobrazená tabulka, kterou naleznete na Wikipedii. Ta říká, že manipulovat lze pouze s pozicemi označenými jako x. K uložení devíti bitů tedy použiji dva bajty.

UTF-8

Momentálně proto stojím před následujícím problémem. Disponuji přiděleným prostorem 110xxxxx 10xxxxxx a chci co něj vložit 1 0101 1001. Musím přitom dodržet, aby se vpravo objevil nejméně významný bit. Ten se nachází na poslední pozici čísla v binárním tvaru. Ve své podstatě udává, zda-li mám to odčinění s lichým nebo kladným údajem. Nejméně přitom dokáže ovlivnit hodnotu čísla, například v desítkové reprezentaci. Můj údaj 1 0101 1001 tedy začínám vkládat z pravé strany a nejprve obohatím druhý bajt – 110xxxxx 10011001. Následně pokračuji vložením zbývající zeleně vyznačené části z 1 0101 1001 do 110xx101 10011001. Jak nyní vidíte, mám dva volné bity, jenž nechci použít. Vložím proto nuly (11000101 10011001) a získávám binární reprezentaci znaku ř v kódování UTF-8. Pro přehlednost mohu výsledek převést do hexadecimální soustavy – C5 99.

Obdobným způsobem pokračuji i v případě znaků ‚e‚ ‚p‚ i ‚a‚, jen si tentokrát vystačím s jediným bajtem.

Na závěr dostávám:

  • ř – C5 9916 – 11000101 100110012
  • e – 6516 – 011001012
  • p – 7016 – 011100002
  • a – 6116 – 011000012

K ověření lze využít tento nástroj.