Jak již název napovídá, přiblížím vám problematiku kódování dokumentu, a také si řekneme, jak správně používat v XHTML češtinu.

Počítač pracuje interně pouze s čísly, přesněji řečeno s bity. Každý bit může nabývat hodnot 1 (true) a 0 (false). Těmito bity jsou tvořeny i textové soubory s XHTML.

V praxi to vypadá tak, že každý znak v tomto souboru je reprezentován kombinací bitů, které dohromady tvoří číslo ve dvojkové (binární) soustavě. Minimální počet bitů je sedm (sedm bitů používá znaková sada ASCII, viz dále), např. znak hvězdička (*) je reprezentován dvojkovým (binárním) číslem 0101010.

Aby počítačový program (prohlížeč, textový editor…) věděl, jak má bity v souboru interpretovat, případně jak má jednotlivé znaky do souboru ukládat, musí znát znakovou sadu a kódování souboru.

Znaková sada (character set)

Znaková sada obsahuje znaky a jejich čísla v pořadí (kódy), např. výše zmiňovaný znak * má kód 42, + má 43 a , 44.

Asi nejjednodušší znakovou sadou je ASCII – obsahuje znaky s čísly 0 až 127, celkem tedy 128. ASCII je tím pádem 7bitová znaková sada, protože různých kombinací (matematicky by bylo správně řečeno variací) lze ze sedmi bitů udělat 27, což je 128. Těchto 128 znaků je ale dostačujících pouze pro angličtinu. Ostatní jazyky zde postrádají některé své specifické znaky, jako jsou písmena s diakritickými znaménky a přehláskami nebo uvozovky dole.

Proto vzniklo několik 8bitových (1bytových [bajtových], protože byte = 8 bitů) znakových sad, které již mohou obsahovat 28 znaků, tedy 256. Prvních 128 znaků a jejich kódů je shodných s ASCII, druhá polovina sady potom obsahuje specifické znaky pro daný jazyk. Takto vznikla např. sada pro západoevropské jazyky (ISO 8859-1, někdy označovaná jako ISO Latin 1), ruštinu (ISO 8859-5) nebo středoevropské jazyky (ISO 8859-2 neboli ISO Latin 2); sem patří mj. i čeština. Tyto znakové sady jsou standardizovány, jak už název napovídá, organizací ISO. Kromě nich ještě přišel Microsoft s vlastními verzemi těchto sad, které se používají ve Windows; pro středoevropské jazyky je to sada windows-1250. Tyto sady jsou téměř shodné s výše zmíněnými ISO-sadami, ale mají některé znaky na odlišných pozicích.

Ani tyto 8bitové sady ale nejsou tím pravým řešením, protože v nich není dost místa pro některé jazyky a navíc je problém, pokud chcete použít např. ruské a české znaky v jednom souboru. Proto vznikly znakové sady, v kterých je dost místa pro všechny znaky všech používaných jazyků: 32bitová (4bytová) ISO 10646 (nazvaná Universal Character Set – UCS) a 16bitová (2bytová) Unicode. První může obsahovat 232 (4 294 967 296) a druhá 216 (65 536) znaků, což znamená, že se zde v jedné sadě nacházejí znaky všech možných jazyků najednou, např. češtiny, arabštiny, korejštiny, japonštiny…

Z ISO 10646 pocházejí také všechny kódy znakových entit v XML a tím pádem i v XHTML. Každý interpret XHTML by proto měl tuto znakovou sadu znát (respektive její aktuální verzi z doby, kdy byl interpret zhotoven, protože tato sada je průběžně rozšiřována o nové znaky).

Kódování znaků (character encoding)

Narozdíl od znakové sady, kódování již přímo určuje, jak je znak (respektive jeho kód ve znakové sadě) převeden na sekvenci bitů. Mezi široce užívaná kódování patří UTF-8 a UTF-16.

UTF-8 kóduje znaky z ASCII do sedmi bitů (v podstatě nejefektivněji jak je to jen možné) a ostatní znaky do 2 až 6 bytů (16 až 48 bitů). České znaky jsou kódovány do 2 bytů.

UTF-16 kóduje všechny znaky do dvou bytů (16 bitů) a je de-facto totožné s Unicode (pouze obsahuje navíc několik speciálních znaků, to ale pro nás není důležité).

8-bitové znakové sady (ISO 8859-x a windows-125x) kódují všechny své znaky do 8 bitů (1 bytu).

Jak je to v praxi

Nejlepším řešením při zachování co nejmenší velikosti souboru (což je pro web důležité) se zdají být kódování UTF-8 nebo 8bitová kódování podle normy ISO. Bohužel je zde několik ale.

Podpora UTF-8 a ISO 8859-2 v aplikacích

Kódování UTF-8 je podporováno všemi moderními prohlížeči (testoval jsem na MSIE 4+, Mozille, Netscape 4+ a Opeře 5+) a mnoha dalšími interprety XHTML, stejně tak je na tom ISO 8859-2. Problém ale nastává s tím, najít editor, který nám umožní soubor v tomto kódování uložit (alespoň ve Windows).

Systém Windows interně pracuje s kódováním windows-1250, a tak v něm i ukládá textové soubory. Mnoho autorů proto exportuje své soubory na web v tomto kódování. Ostatní systémy ale většinou používají ISO 8859-2, případně rovnou UTF, proto zde mohou nastat problémy, i když dnes již většina prohlížečů na těchto platformách umí windows-1250 (protože prostě nebylo jiného zbytí). Jedná se ale o nestandardní kódování, a proto byste se mu měli snažit vyhnout. Jak toho dosáhnout?

První možností je používat editory, které umí ukládat soubory i v jiném kódování než windows-1250. Z freewarových to dokáže např. český PSPad (ISO 8859-2 i UTF-8). Z komerčních editorů to umí Dreamweaver od Macromedia (verze 4 zvládá ISO 8859-2 a MX navíc UTF-8), AceHTML od Visicom Media (ISO 8859-2 i UTF-8), naopak slavný editor HomeSite, považovaný za krále tohoto oboru, umí ukládat soubory jen ve windows-1250.

Další možností je používat freewarový program Konverze češtiny od Pokluda Software, který umí převádět soubory mezi kódováními ISO 8859-2, windows-1250 a jinými (bohužel ne UTF-8). Tento program se dá spouštět i z příkazové řádky, a proto si můžete snadno přidat jeho podporu do vašeho editoru.

Poslední možností je potom překódování na serveru. Ten vždy stránku překóduje do kódování preferovaného uživatelem (to se serveru předává pomocí HTTP-hlavičky Accept-Charset). V tomto případě se musíte informovat, jestli váš server překódování podporuje. Tato možnost je ale pro server vždy zátěží, navíc existují standardní kódování, která má každý prohlížeč podporovat (a většinou tomu tak i je), proto bych toto řešení dnes již příliš nedoporučoval.

Určení kódování

A pro jaké kódování se při vytváření stránky rozhodnout? Vývoj směřuje k používání UTF-8, které pokrývá všechny znaky a je z toho důvodu jednodušší k využití než mnoho různých kódování pro různé jazyky. Jeho podpora je již vcelku slušná, proto se mi zdá být nejvhodnějším řešením. Vhodné je i ISO 8859-2, alespoň do té doby, než se v editorech rozšíří UTF-8. Narozdíl od UTF-8 se ale jedná o kódování pokrývající jen část ISO 10646. Pokud nebudete moci ve Windows použít ani jedno z nich, můžete se uchýlit i k windows-1250. Nejedná se ale o standard, a proto jeho podpora v interpretech XHTML není zdaleka samozřejmostí. Ať už se ale rozhodnete pro jakékoliv kódování, měli byste ho sdělit interpretovi XHTML, aby neměl problémy s jeho určením.

To můžete udělat jednak pomocí HTTP-hlavičky Content-Type a jejího parametru charset. HTTP-hlavičky předává server prohlížeči spolu se stránkou. Podoba této hlavičky pro kódování ISO 8859-2 by byla následující:

Content-Type: text/html; charset=iso-8859-2

Poznámka: Jména HTTP-hlaviček ani jména kódování nejsou v XHTML citlivá na velikost písmen, a tak UTF-8 znamená to samé jako utf-8.

Pokud nemáte možnost použít HTTP-hlavičku, můžete využít element meta (ještě se k němu dostaneme). Ten by měl být uveden v kódu stránky co nejdříve a pokud možno před tím, než se v dokumentu objeví jiné znaky než ty, které jsou součástí ASCII. Příklad pro kódování UTF-8:

<meta http-equiv=“content-type“ content=“text/html; charset=utf-8″ />

Pokud prohlížeč dostane v HTTP-hlavičce jinou informaci než v elementu meta, měl by dát přednost HTTP-hlavičce.

Kromě jedné z těchto možností musíte uvést kódování v XML deklaraci (viz třetí díl seriálu), pokud je jiné než UTF-8 nebo UTF-16 (pokud používáte v souboru jedno z těchto kódování, můžete pseudoatribut encoding vynechat). Příklad pro kódování windows-1250:

<?xml version=“1.0″ encoding=“windows-1250″?>

Pokud se ptáte, proč je třeba kódování uvádět na dvou místech, je to kvůli kompatibilitě s HTML – to používalo jen HTTP-hlavičku nebo element meta, zatímco XML používá pouze XML deklaraci. V budoucnu (až se plně rozšíří prohlížeče znalé XHTML) budeme nejspíš používat již pouze XML deklaraci.

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

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

1 Příspěvěk v diskuzi

  1. Ahoj:DD můžu se zeptat, jak jste udělali možnos „Přidávání komentářů“ ?.. strašně moc bych to potřeboval vědět.. zrovna vytvářím XHTML stránku :)

Odpovědět