\"/
\"/ \"/    

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

Jaromír Doleček, FI MU, ÚVT MU
Ročník VIII - číslo 5, červen 1998
Citace: J. Doleček. Standard Unicode - cesta z chaosu kódování znaků. Zpravodaj ÚVT MU. ISSN 1212-0901, 1998, roč. VIII, č. 5, s. 8-13.
Tematické zařazení: Standardy
 předchozí článek | následující článek 

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

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 formovala 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.

A čísla byla použita k označení znaků národních abeced, ale také k označení jiných grafických symbolů, 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, aby se veškerá použitá písmena jazyka vešla 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ě - číselný kód označující v češtině např. znak "š" 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-mailový nebo WWW klient, který si dělá nárok na to, aby byl kompatibilní s MIME. 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 výmě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 jednom jazyce se v jiném jazyce s nejvyšší pravděpodobností zobrazí prostě špatně. Stále se zvyšující potřeba výměny dokumentů elektronickou 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 softwaru, 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 softwaru 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 zachází 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á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ějí, 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 nekonzistentní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 softwaru, vydavatelé novin a knih, knihovnické informační služby 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 rostla také potřeba volné výměny dokumentů bez závislosti na zdrojovém nebo cílovém prostředí. Také explozivní růst Internetu 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:

Pokrytí

Verze 2.0 standardu Unicode obsahuje 38 885 znaků světových abeced. Postačuje více než dostatečně nejen pro běžnou komunikaci, ale také k vyjádření některých starších forem mnoha jazyků. Jazyky, které je možno pomocí Unicode 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ých a publikovaných 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 vyhrazeno 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 konkré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 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 dvou po sobě následující bytů. 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

UCS2-2 je základní způsob zápisu Unicode znaků. Pro uložení dat se používá posloupnost 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, protož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

UTF3-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ána 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 se dá nalézt například na [4]).

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 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 pojaty 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 obtíž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ícebitovém zápisu znaku následují.
  5. Transformační formát by neměl být zbytečně rozmařilý co do počtu bytů použitých pro zápis.v
  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é posloupnosti mají nastaven nejvyšší bit. 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: Způsob zápisu Unicode znaků pomocí UTF-8

Velmi jednoduše se tento transformační formát dá zapamatovat tak, že v prvním bytu posloupnosti 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ódů starajících se o zobrazování znaků). Není divu, ž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í - jejich 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 byl Unicode přinejmenším ignorován, 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 ;-)

Literatura

[1] http://www.unicode.org/
- domácí stránka Unicode Consorcia
[2] http://www.unicode.org/unicode/standard/standard.html
- specifikace Unicode, popis jednotlivých znaků, použité oblasti hodnot
[3] http://www.unicode.org/unicode/standard/principles.html
- technický úvod do Unicode
[4] http://www.stonehand.com/unicode/standard/
- mirror starší verze stránek Unicode Consorcia, na nových stránkách jsem nebyl schopen znovu nalézt popis UTF-7 a UTF-8
... zpět do textu
[5] Flanagan, David: Programování v jazyce JAVA. Praha : Computer Press, 1997.
ISBN 80-85896-78-8
setting
1 American Standard Code for Information Interchange
... zpět do textu
2 Universal coded Character Set
... zpět do textu
3 Universal Transformation Format
... zpět do textu
Zpět na začátek
ÚVT MU, poslední změna 14.11.2011