Nahlédněte i do Diskuse pod čarou!

Unicode - cesta z chaosu kódování znaků

Na začátku bylo slovo. Toto slovo bylo zapsáno v sedmibitovém ASCII

A slovo se šířilo. Ze své vlasti Ameriky do ostatních částí světa. Oblastí, kde písmem není latinka, oblastí, kde se písmena používají společně s diakritickými znaménky, aby formovaly nová písmena. Sedmibitový svět (kde každé písmeno je v počítači reprezentováno číslem 0-127) ztrácel dech.

I přišel ke slovu (do té doby opomíjený) osmý bit z jednoho Byte. Původně zbytečný a používaný ke kontrole přenášených dat pomocí parity, nyní rozšířil znakovou sadu o 128 nových pozic.

Tato čísla byla použita k označení znaků národních abeced, ale také k označení jiných grafických symbolům jako je znak měny nebo rámečky. Brzy bylo jasné, že vzhledem k rozmanitosti různých jazyků a rozmanitosti jednotlivých používaných písmen ani 256 znaků nestačí pro písmena všech abeced. Nejjednodušší a v té době postačující řešení bylo tedy používat pro každý konkrétní jazyk jeho vlastní kódování znaků, tak, že veškeré použité písmena jazyka se vejdou do sady o velikosti 256 znaků.

Bohužel tento systém má několik základních nedostatků. Je sice možné předávat si jednoduše dokumenty v prostředí, které používá stejnou znakovou sadu, ale text napsaný původně v češtině se zobrazuje špatně třeba ve francouzštině - číslo, označující v češtině třeba "š" může ve francouzštině označovat třeba "1".

Navíc snad každá firma, která má jakýsi vliv na IT, pokládá za povinnost vyvinout a prosazovat vlastní kódování znaků - například v našem malém Česku se více či méně používá 6 (!) různých kódování češtiny - tj. šest různých počítačových reprezentací reálných českých písmen. Kromě ryze českých Kameníků a našimi bývalými (zaplaťpánbu, že bývalými) bratry v socialismu prosazovaným KOI-8 to je Microsoft (windows-1250), IBM (CP852) i Apple(x-mac-ce). Přitom existuje platný mezinárodní standard - ISO-8859-2. Tuto naprostou bezohlednost počítačových firem zaplatí samozřejmě pouze uživatelé. Jediná cesta z této svízelné situace je cílené prosazování mezinárodních standardů, nezávislých na počítačových firmách. I v Česku se situace (snad i díky Inetu) pomalu konsoliduje. Jasná je podpora ISO-8859-2, tomuto kódování musí rozumět jakýkoli e-mejlový nebo WWW klient, který si dělá nárok na to, aby byl kompatibilní s MIME (viz důvody pro používání ISO-8859-2). Díky monopolnímu postavení Microsoftu na poli operačních systémů se bohužel asi ještě dlouho nezbavíme windows-1250. Ostatní kódování pomalu vymírají, tak jak se systémy pomalu nahrazují rychlejším, stabilnějším a výkonnějším Un*xem, popřípadě na běžného uživatele zaměřenými MS Windows.

To, že je mnohdy těžké shodnout se na jednom kódování jediného jazyka dává tušit, jaké jsou problémy s vyměnou dokumentů v různých jazycích. Každý jazyk má svou znakovou sadu, nejlépe ještě v několika variantách a dokument napsaný v jiném jazyce se s nejvyšší pravděpodobností zobrazí prostě špatně. Stále se zvyšující potřeba výměny dokumentů elekronickou cestou zákonitě vede k potřebě nějaké globální abecedy, která by umožnila bezproblémovou výměnu dokumentů. Vzhledem k tomu, že přechod na angličtinu (a tím i zbavení se problému národních abeced) v dohledné době nehrozí, bylo třeba najít řešení jiné.

Unicode Consorcium

Roku 1991 bylo oficiálně, po několika letech neformální spolupráce, založeno Unicode Consorcium. Vzalo si za úkol postarat se o prosazení a další vývoj 16 bitového kódování pro znaky nejdůležitějších světových jazyků, spolu s mnoha historickými a archaickými znaky.

Consorcium se snaží spojit síly nejdůležitějších průmyslových společností a vývojářů ke standardizaci mezinárodní znakové sady. Výsledkem jeho práce je standard Unicode, který je základem internacionalizace a lokalizace software, který se stal také součástí širšího standardu ISO/EIC 10646;1993.

Primární úlohou Consorcia je vyvíjet a podporovat standard Unicode; pomáhat při jeho implementaci do software; a také zajišťovat fundovanou kontrolu nad budoucími revizemi standardu.

Co je to Unicode?

Standard Unicode je 16 bitové kódovací schéma s neměnnou šířkou, určené pro zápis znaků v textu. Toto mezinárodní kódování obsahuje znaky hlavních světových abeced a také často používané technické znaky. Kódování Unicode zachazí se znaky abeced i různými jinými symboly stejným způsobem, takže mohou být používány společně. Unicode vychází z ASCII, používá ale 16 bitů pro identifikaci znaků, aby bylo možné podporovat vícejazyčné texty. Pro žádný znak z kteréhokoli jazyka nejsou třeba žádné escape sekvence nebo jiný kontrolní kód.

Standard Unicode definuje numerickou hodnotu a název pro každý ze svých znaků; v tomto ohledu je podobné jiným systémům pro kódovávání znaků, počínaje ASCII a konče mezinárodním standardem ISO/EIC 10646-1:1993.

Standard Unicode obsahuje, mimo přiřazení kódů a názvů jednotlivým znakům, i další informace, které obvykle ve znakových sadách chybí, ale jsou nezbytné pro implementaci kódování. Standard definuje vlastnosti znaků a obsahuje také další aplikační data, jako jsou převodní tabulky mezi malými/velkými písmeny a mapování Unicode do mnoha mezinárodních, národních a průmyslových znakových sad. Tyto informace jsou šířeny přímo Unicode Consorciem proto, aby byla zajištěna konzistence při výměně dat v Unicode.

Cíle návrhu

Vývoj Unicode si dává za úkol vyřešit dva základní problémy, běžné ve vícejazyčných počítačových programech - dostupnost fontů pro různá kódování znaků a problém existence několika někonzistentních znakových sad díky neshodě národních a průmyslových znakových standardů.

V roce 1988, kdy projekt Unicode začal, byli neexistencí konzistentní mezinárodní znakové sady nejvíce zasaženi vydavatelé vědeckého a informačního software, vydavatelé novin a knih, knihovnické informační službt a akademičtí vývojáři. Od té doby stále sílila potřeba budovat software tak, aby byl snadno přizpůsobitelný lokálním jazykovým podmínkám. Stále roste také potřeba volné výměny dokumentů, bez závislosti na zdrojovém nebo cílovém prostředí. Explozivní růst Internetu dále podpořil požadavek znakové sady, která by byla stejná kdekoli na světě.

Vývojáři standardu Unicode přišli s myšlenkou jednotné metody identifikace znaků, která by byla efektivnější a snadněji přizpůsobitelná než předchozí kódovací systémy. Nový systém by měl být dostatečně kompletní, aby zajistil potřebu vícejazyčné práce s počítačem a měl by kódovat širokou paletu znaků pro profesionální zpracování textů v jakémkoli moderním jazyce.

Původní cíle standardu Unicode byly tyto:

Univerzálnost.
Kapacita znakové sady musí být dostatečná k zahrnutí všech znaků, které by mohly být použity při výměně textů - zejména ty, které už byly definovány v hlavních mezinárodních, národních a průmyslových znakových sadách.
Efektivita.
Text, poskládaný z posloupnosti znaků o konstantní šířce, je velmi jednoduchý na zpracování; software nemusí uchovávat stav, dávat pozor na speciální escape sekvence nebo prohledávat text dopředu či zpět kvůli identifikaci znaků.
Jednotnost.
Konstatní šířka znaků dovoluje efektivní třídění, hledání, zobrazování a editaci textů.
Jednoznačnost.
Kterákoli 16 bitová hodnota reprezentuje v jakémkoli kontextu stejný znak.

Pokrytí

Verze 2.0 standardu Unicode obsahuje 38.885 znaků světových abeced. Postačuje nejen pro více než dostatečně pro běžnou komunikaci, ale také k vyjádření některých starších forem mnoha jazyků. Jazyky, které je možno pomocí Unicde zakódovat jsou momentálně ruština, arabština, anglosaština, řečtina, hebrejština, Thai a Sanskrit. Sjednocená podmnožina Han obsahuje 20.902 grafických symbolů definovaných jako národní a průmyslové standardy Číny, Japonska, Korey a Taiwanu. Standard Unicode navíc zahrnuje matematické operátory a technické symboly (například některé geometrické tvary) a několik grafických symbolů.

Standard Unicode zahrnuje znaky všech hlavních mezinárodních standardů schválené a publikované před 31.prosincem 1990; především rodiny standardů ISO International Register of Character Sets, ISO/EIC 6937 a ISO/IEC 8859, také ISO/IEC 8879 (SGML). Jiné primární zdroje zahrnují bibliografické standardy používané v knihovnách (například ISO/EIC 5426 a ANSI Z39.64), nejdůležitější národní standardy a různé často používané průmyslové standardy (včetně znakových sad od Adobe, Apple, Fujitsu, Hewlett-Packard, IBM, Lotus, Microsoft, NEC, WordPerfect a Xerox). Ve verzi 2.0 byl přidán obsah Hangul z korejského národního standardu KS C 5601.

Unicode není určen pro kódování různých nesmyslných, osobních, románových a málokdy používaných znaků nebo znaků pro osobní potřebu, ani log nebo grafiky. Umělé znaky, použité pouze pro přechodné vkládání textu, jsou vynechány. Obrázky bez návaznosti k textu, jako jsou například hudební nebo taneční značky, nezasahují do oblasti zájmu Unicode. Různé odlišnosti v zobrazení znaků nejsou zachyceny. V rámci Unicode je vyhraženo 6400 znaků pro potřeby aplikací; použití těchto kódů aplikacemi není nijak omezeno.

Standard Unicode je stále ve vývoji. Nové znaky budou postupně přidávány, mohou se měnit názvy znaků, které jsou částí Unicode; jejich konrétní kódy však zůstávají stejné i v dalších verzích standardu.

Implementace

Myšlenka Unicode jako sjednocujícího světového kódování znaků je jistě výborná. 16 bitové kódování přináší však i několik nevýhod:
Větší délka textu.
Text je po převodu z osmibitového kódování do Unicode dvojnásobně delší, zdánlivě bez přidání informační hodnoty. Výsledek zabere víc místa při uložení a také následné zpracování je pomalejší.
256x větší znaková sada.
Znaky na počítači se zobrazují pomocí fontů, které pro Unicode musí obsahovat 256x víc znaků než pro osmibitové znakové sady. Vzhledem k tomu, že v mnoha jazycích se použije jen nepatrný zlomek celkového množství, znaky navíc zbytečně zabírají místo. Microsoft tohle řeší tak, že ani Unicode fonty neobsahují všechny znaky, ale pouze ty, které jsou používané v daném prostředí - a v případě potřeby je možno pořídit "plné" fonty.
Nekompatibilita s osmibitovým prostředím.
Unicode text může "legálně" obsahovat znaky, které v "normálním", osmibitovém textu obvykle nejsou a zpravidla mají speciální význam - jedná se zejména o binární nulu, kterou Unicode text může obsahovat jako vyšší byte dvoubytového kódu. Nelze tedy použít stávající programový kód pro práci s textem a musí se od základu přepsat.

Nelze jednoduše zjistit, jestli daný text je v Unicode nebo ne, nelze proto jednoduše zároveň používat Unicode a nějaké osmibitové kódování. Není tedy možné přejít na Unicode částečně, je nutný globální přechod, aby aplikace nejen dostaly text v Unicode, ale aby hlavně Unicode text i očekávaly. Fakt, že to jde v rámci uzavřeného systému, předvádí názorně firma Sun s Javou, pracující interně v Unicode, a také produkty firmy Microsoft. Podporu Unicode však nelze zajistit obecně a nelze počítat s tím, že mu druhá strana bude vždy rozumět - nasazení v poště nebo na WWW je tedy přinejmenším problematické. Alespoň v tomto bodě se však situace pomalu mění k lepšímu.

V mnoha jazycích (i v češtině) netvoří "speciální" znaky (např. znaky s diakritikou) ani zdaleka většinu písmen. Pro velké kvanta textu postačuje ASCII, sem tam proložené akcentovaným znakem. Pro takové texty je naprosto zbytečné použít dva byte na uložení každého písmene - jeden byte plně dostačuje. Ne každé médium také podporuje binární přenos a ne vždy vyhovuje zápis Unicode znaku jako dva po sobě následující byty. Postupem času vzniklo několik různých jiných zápisů Unicode, které řeší některé problémy s přenosem nebo používáním Unicode.

UCS-2

UCS-2 je základní způsob zápisu Unicode znaků. Pro uložení dat se používá poslopnost dvoubytových položek. Konec textového řetězce může být označen například 16 bitovým NULL, tedy 0x0000; je třeba dát pozor, že osmibitové NULL (0x00) se může objevit ve vyšším nebo nižším byte čísla Unicode znaku. Velkou výhodou UCS-2 oproti jiným formám je konstantní délka znaku a snadné zjišťování počtu znaků v řetězci, je tedy vhodná zejména pro vnitřní reprezentaci Unicode znaků v programu.

UTF-7

UTF-7 je forma popsaná pomocí RFC-1642. Jedná se o zápis Unicode znaků primárně určený pro použití v elektronické poště. Internetová pošta momentálně (podle definice RFC-822) podporuje pouze sedmibitové ASCII, specifikace MIME (RFC-1521 a RFC-1522) pak rozšiřuje podporu také na vybraná osmibitová kódování (například rodinu standardů ISO-8859-*). MIME však nezařazuje Unicode mezi povolené znakové sady, ani nespecifikuje, jak by mělo být zakódováno, i přesto, že myslí na přidávání nových znakových sad.

UTF-7 je forma, která používá pro zápis Unicode znaků pouze ASCII hodnoty a je navržena tak, aby zakódovaná data byla co nejlépe čitelná člověkem; všechna podporovaná ASCII písmena nejsou tedy nijak kódováná a reprezentují přímo sebe. Je také akceptován fakt, že některé systémy (například systémy používající EBCDIC) nedokáží zpracovat dokonce ani celé ASCII, takže Unicode znaky jsou zapsány tak, aby výsledek byl čitelný na jakémkoli systému. Pro zápis znaků se používá algoritmus velmi podobný base64, podrobný popis je však mimo záběr tohoto článku, dá se nalézt například jinde.

UTF-8

Jedná se o doporučený způsob zápisu ISO/EIC 10646 znaků pro UCS-2 i UCS-4. Může tak posloužit i pro zápis Unicode.

Pro ukázku si můžete pomocí tohoto skriptu nechat převést jeden kód UTF-8 na binárni i grafické vyjádření. (To druhé jen v případě, že váš prohlížeč UTF-8 dovede.)

Pro prosazení ISO/IEC 10646 (Unicode) jako mezinárodního standardu a jeho rozšíření bylo třeba pro softwarové systémy, historicky založené na ASCII, nalézt způsob, jak na nich používat to velké množství znaků, které byly pojmuty novým standardem.

S UCS souvisí několik problémů, spojených s historií operačních systémů a prostředím jazyka C. Největším problémem je vícebytové kódovací schéma, použité v UCS. Opravdu opbtížné je skloubit standard UCS s existujícími programovacími jazyky a existujícími operačními systémy a programy. Je naprosto nezbytné, aby se existující software nemusel příliš upravovat a přitom bylo možno použít velké množství znaků definované v UCS.

Cíle UTF-8 jsou zejména:

  1. Kompatibilita se staršími souborovými systémy. Souborové systémy zpravidla nepovolují v názvech souborů nulový byte ani (zpětné) lomítko.
  2. Kompatibilita s existujícími programy. Zápis jakéhokoli znaku by neměl obsahovat ASCII, pokud znak původně v ASCII nebyl.
  3. Snadnost konverzí z/do UCS.
  4. První byte by měl určovat počet bytů, které ve vícebytovém zápisu znaku následují.
  5. Transformační formát by něměl být zbytečně rozmařilý co do počtu bytů, použitých pro zápis.
  6. Z kterékoli pozice v proudu dat by mělo být možné najít začátek další znakové jednotky.

UTF-8 zvládá zápis UCS hodnot v rozmezí 0-0x7ffffff za použití 1-6 bytů. Úvodní byte vždy prozrazuje počet použitých bytů a následující členy vícebytové poslopnosti mají nastaven nejvyšší bit. je nastaven. Jakýkoli byte, který nezačíná na 10xxxxxx je začátek zápisu dalšího znaku.

bitů hex min hex max zapsaná posloupnost bytů ve dvojkové soustavě
0-7 00000000 0000007f 0vvvvvvv
8-11 00000080 000007FF 110vvvvv 10vvvvvv
12-16 00000800 0000FFFF 1110vvvv 10vvvvvv 10vvvvvv


Tabulka 1: Způsob zápisu Unicode znaků pomocí UTF-8

Velmi jednoduše se dá tento transformační formát zapamatovat tak, že v prvním bytu poslopnosti určuje počet bitů zleva po první nulu počet bytů, které následují.

Velmi sympatické je, že na obyčejný ASCII text je potřeba pouze jeden byte a kterýkoli znak Unicode lze zapsat maximálně jako tři znaky v UTF-8. Čeština má navíc to štěstí, že její akcentované znaky mají poměrně dost malé Unicode hodnoty, takže jakýkoli český Unicode znak lze v UTF-8 zapsat maximálně na dva byty.

S Unicode textem zapsaným v UTF-8 lze zacházet stejně jako s obyčejným osmibitovým, není třeba nic speciálně ošetřovat ani psát žádný speciální programovací kód pro zacházení s Unicode (snad kromě kódy, starající se o zobrazování znaků). Není divy, že se UTF-8 prosazuje jako univerzální formát pro výměnu dokumentů v Unicode. Formát UTF-8 odstraňuje všechny nevýhody nasazení Unicode - zachovává kompatibilitu se stávajícím kódem a přitom umožňuje aplikacím použít všech výhod univerzální mezinárodní znakové sady.

Zhodnocení

Unicode řeší největší problém globální výměny informací - její jednoznačný zápis způsobem, který zajistí konzistenci a bezproblémové užívání kdekoli na světě. Je trochu cizí pro systémy, originálně založené na ASCII, ale s použitím vhodného formátu zápisu je možno docílit, aby Unicode přinejmenším bylo ignorováno, jeho nasazení nezkazilo stávající programy a nebylo třeba investovat příliš velké úsilí na jeho podporu. Jednou a navždy definuje, jaké vnitřní označení bude mít znak v počítači, čímž eliminuje chaos nekompatibilních znakových sad a standardů. Věřím tomu, že přijde den a celý svět se sjednotí na Unicode. Bylo by výborné, kdyby se do té doby (aspoň u nás, v Česku) podařilo sjednotit také na jednom osmibitovém kódování - usnadnilo by to pozdější přechod na Unicode. Ale to už zní skoro jako utopie ;-)

Reference

Vysvětlivky