Znakové sady v praxi – základní teorie

3. prosince 2003

Na počátku každého projektu stojíme před důležitým rozhodnutím – jakou zvolit znakovou sadu? Pokud tuto problematiku podceníme, můžeme se později dostat do značných potíží. V tomto článku se dozvíte základní informace z této oblasti, které jsou potřeba pro správné pochopení a použití znakových sad v praxi.

Osm bitů na znak

Jak zajisté všichni víme, v digitálním světě je každý text reprezentován posloupností čísel. Způsob, jakým je text v digitální podobě uložen, je určen použitým kódováním znaků (character coding) pomocí dané znakové sady (character set). Znaková sada přitom definuje přiřazení konkrétních znaků k jejich kódům a kódování nám říká, jakým způsobem se budou tyto kódy zapisovat do posloupnosti digitálních dat. Společně s rozšiřováním počítačů vznikaly s rostoucími požadavky také nové znakové sady a další způsoby jejich kódování. Aby se ve zmatku nastolil alespoň trochu pořádek, udržuje organizace IANA seznam doporučovaných znakových sad pro prostředí internetu.

Pro kódování českých znaků s diakritikou se nejvíce používá sada ISO-8859-2 a Windows-1250. Lepší je zřejmě používat znakovou sadu ISO, neboď byla standardizována dříve, tím pádem má trochu lepší podporu starších softwarových produktů. O Windows-1250 se tvrdí, že není standardní, ovšem toto tvrzení je nyní již pouhým mýtem. Zavádějícím je zjevně právě ono „Windows“ v názvu, pro název však existuje i alias CP1250. Faktem je, že tato znaková sada vznikla právě kvůli podpoře východoevropských jazyků v MS Windows 3.0. Toto (záměrné?) nedodržování standardů Microsoftu zazlívá mnoho odborníků, avšak MS není jediný – podobně například vznikla sada Mac OS CE pro Macintosh.

Volba vhodné sady však neleží pouze na nás, ale hlavně na možnostech našeho editoru. Kdo používá oblíbený HomeSite, je velice omezen, neboť tento program zvládá pouze výchozí osmibitové kódování operačního systému, v českých Windows je to Windows-1250. V případě Macromedia Dreamweaveru a nebo PSPadu je situace mnohem lepší, neboť ty mají zabudovanou podporu mnoha různých znakových sad. Poznámkový blok ve Windows zvládá pouze Windows-1250 a UTF-8 (viz níže), ovšem v podstatě si nelze kódování vybrat explicitně. Jak vidíte, při výběru vhodného editoru je velice vhodné brát zřetel hlavně na podporu práce se znakovými sadami, ať nejsme později při práci zbytečně omezeni.

Dosud jsme uvažovali pouze o osmibitovém kódování, kterým lze vyjádřit pouze 256 různých znaků, přičemž obvykle prvních 128 znaků odpovídá standardnímu ASCII a zbývajících 128 znaků záleží na dané znakové sadě a obsahuje speciální znaky daného jazyka (popřípadě několika jazyků). Co když však potřebujeme v jednom textu psát více jazyky? Existuje nějaké univerzální řešení? Jak zřejmě tušíte, odpovědí je Unicode.

Přidáváme bity… Unicode

Vznik kódování Unicode byl rozhodujícím krokem pro vyřešení dosavadních problémů při práci s textem. Jde o (původně) 16bitovou znakovou sadu, umožňuje tedy zápis až 65 536 různých znaků. Standard definuje prozatím kolem 50 000 znaků, ale postupně se přidávají další. Základním zápisem je UCS-2, používajícím vždy 2 bajty pro každý znak (16 bitů), takže je bohužel nekompatibilní s 8bitovým kódováním a v podstatě nelze zjistit, zda je daný text v Unicode nebo nikoli. Proto vzniklo (mimo jiné) kódování UTF-8, které je nyní nejběžnější a speciální znaky kóduje do dvou až šesti bajtů, přičemž všechny mají hodnotu nad 127 – nelze je tedy zaměnit s ASCII znaky a tím pádem se výborně hodí pro zápis zdrojových textů v jazycích, které původně s použitím UTF-8 nepočítaly.

Problematika znakových sad a jejich kódování byla na Intervalu probírána již dříve v článku Martina Snížka v souvislosti s XHTML – v tomto článku se dozvíte, jak správně použité kódování zapsat do kódu stránky.

Volba znakové sady

Pokud začínáme pracovat na novém projektu, je třeba tuto problematiku nezlehčovat a volbu znakové sady zvážit co nejpečlivěji, s ohledem na budoucí rozšiřování. V případě české několikastránkové prezentace, u níž se nepočítá s jazykovými mutacemi, doporučuji použití ISO-8859-2, ovšem pozor – že nepotřebujete jazykové mutace nyní neznamená, že je nebudete potřebovat nikdy! Pro větší projekty je mnohem vhodnější hned zpočátku zvolit kódování UTF-8, předejdete tím značným problémům, které by mohly nastat v souvislosti s narůstajícími požadavky.

Samozřejmě nestačí si kódování znaků zvolit, ale musíme jej také uvést do zdrojového kódu webové stránky. U obyčejného HTML je velice vhodné nezapomenout na známý metaelement, pro XHTML nastavte atribut encoding v úvodní hlavičce XML dokumentu (viz výše zmiňovaný článek). Kódování znaků je nutné nastavovat také při generování emailů, zde doporučuji používat pro češtinu výhradně ISO-8859-2. Provádí se opět přidáním hlavičky, tento úkol by měla zvládat emailová komponenta. Přitom je dobré vědět, že toto nastavení nemá vliv na kódování předmětu zprávy a dalších položek (odesilatel, příjemce), to je uvedeno zvlášť přímo v jednotlivých hlavičkách dle RFC 2047. Pozor na oblíbenou komponentu JMAIL, která tvrdošíjně nastavuje pro tyto hlavičky kódování ISO-8859-1, takže češtinu není možné používat!

U databázových aplikací volbou znakové sady generovaných stránek problematika zdaleka nekončí, je nutné také zvolit způsob ukládání textů do databází či jiných úložišť. Zde jsme omezeni možnostmi systému, způsobem, jakým s textem pracuje, a svými požadavky na komunikaci s ním. Zde může být z hlediska výkonnosti práce s textem výhodnější použít přímo základní tvar UCS-2. Práce s 16bitovými znaky je totiž pro počítač mnohem pohodlnější, než v případě znaků s variabilní délkou zápisu (UTF-8). Jde hlavně o činnosti, které provádí přímo databáze, například vyhledávání, řazení a třídění, konverze velikosti písmen a nebo i jednoduché zjištění délky textu (které v případě UTF-8 může znamenat nutnost projít celý text). Pak ovšem přichází ke slovu konverze znakových sad.

Konverze mezi znakovými sadami

Při tvorbě větší client/server aplikace se pravděpodobně dostanete do situace, kdy je třeba programově převést nějaký text z jedné znakové sady do jiné, ať již při komunikaci s klientem, nebo s databází, a nebo třeba při generování emailů nebo reportů v excelu apod. Řešení pak silně závisí na možnostech prostředí, pod kterým svou aplikaci provozujete.

Například v PHP existuje velice silná knihovna GNU recode, která zvládá práci i s poměrně exotickými kódováními, dokáže přímo pracovat s HTML entitami a provádí další vylomeniny. Jsme ovšem samozřejmě vázáni existencí této komponenty nebo podobných komponent v jiných prostředích. V praxi se však může snadno stát, že na serveru prostě žádná vhodná komponenta nainstalována není a nebo na její existenci nelze spoléhat. Pak je nutné zajistit potřebné konverze ve vlastní režii.

V dalších článcích si povíme o základech konverze mezi znakovými sadami, o tom, jak sestavovat a používat konverzní tabulky, a sestavíme si algoritmus pro konverzi mezi libovolnými znakovými sadami včetně UTF-8.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek control
Další článek Autor webu je chráněn
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Martin Fiala

    Led 16, 2020 v 15:57

    Online nástroj pro konverzi znakových sad je na http://retezce.jednoduse.cz/

    Odpovědět

Napsat komentář: Martin Fiala Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *