Samizdatová skripta

Čeština a web


Kódování (enconding)

Každý zobrazitelný znak má přiřazené číslo, které je zapsáno v tabulce znakové sady. Jednou z prvních znakových sad byla ASCII a obsahovala jen znaky užívané v angličtině. Postupem času se rozšiřovaly počítače do různých zemí a v každé si zemi vytvořili rozšířenou ASCII tabulku pro svůj jazyk. Ty umožňovaly zakódovat maximálně 256 znaků – každý znak vyžaduje 1 bajt.

Kódování pro český jazyk úpravou ASCII vytvořili například bratři Kameničtí. Později byly pro kódování vytvořeny mezinárodní normy. Obvykle pro jednu skupinu jazyků je zvolena jedna znaková sada, například ISO-8859-2 pro středoevropské jazyky. OS Windows užívá své vlastní kódování, které se od normy ISO liší.

256 znaků ale mnohdy nestačí, a tak konsorcium firem dalo vzniknout sadě UNICODE, která obsahuje 65536 znaků. Pro psaní stránek se ale UNICODE neujal, neboť na zakódování jednoho znaku jsou potřeba 2 bajty. Velikost stránky při užití UNICODE tedy vzroste na dvojnásobek.

Dobrým kompromisem je použití sady UTF-8, která umožňuje zakódování téměř neomezeného množství znaků. Využívá proměnné délky znaku. Zatímco k zakódování znaků s ASCII hodnotou 0 - 127 (tj. znaky užívané v angličtině) potřebuje pouze jeden bajt, k zakódováni znaků s diakritikou dva bajty, čínských, korejských a dalších znaků tři a více bajtů. To znamená, že můžete na jedné stránce vedle sebe zobrazovat různé jazyky, a přitom se velikost dokumentu v češtině zvětší maximálně o 20%.

Vzhledem k existenci mnoha různých kódování musí prohlížeč vědět, které má zvolit, jinak se některé znaky zobrazí špatně nebo vůbec.

Řešení je přitom jednoduché, je potřeba do hlavičky stránky vložit tento kód:

   <META http-equiv="Content-Type" content="text/html; charset=Název vámi zvoleného kódování">
a v tomto kódování soubor uložit!

Pro středoevropské jazyky možno použít následující kódovací sady:

Tímto způsobem se udává, v jakém kódování je HTML dokument napsán – v tomto kódování je potřeba soubor i uložit. Poznámkový blok (Notepad) ve Windows automaticky používá WINDOWS-1250, v pokročilejších editorech můžete znakovou sadu pro uložení většinou zvolit. Pokud ukládáme soubor v UTF-8, je potřeba vypnout ukládání značky BOM (Byte Order Mark), která textovým editorům říká, jak je soubor uložený, ale prohlížeče může velmi mást.

Výchozí nastavení internetových prohlížečů obvykle zajišťuje volbu znakové sady, uvedené ve zdrojovém kódu stránky.

Pozn. Pokud zdrojový kód stránky dynamicky generujeme (např. pomocí PHP) z více souborů, je potřeba, aby veškerý vkládaný text byl v jednom kódování - tj. všechny použité soubory v jedné znakové sadě.

UNICODE, UTF-8 a UTF-16*

Jestliže chceme, aby počítač uměl pracovat s textem, musíme nadefinovat, jaké znaky se v textu mohou vyskytovat. A protože počítače vnitřně reprezentují veškeré informace pomocí čísel, musíme těmto znakům přiřadit číselné kódy, které je budou zastupovat. Znaková sada je právě taková množina znaků, kde má každý znak přiřazený číselný kód. Znaková Omezuje repertoár znaků, které je možné v textu používat.

Znakové entity

Jedná se o skupinu znaků, která se při interpretaci internetovým prohlížečem zobrazí jako nějaký znak.

Příklad: á = & aacute ; (tzn. Jirásek vypíše Jirásek) (viz příloha Tabulka znakových entit).

Více na: http://www.jakpsatweb.cz/html/entity-vsechny.html

Mezery

V typografii se používá několik druhů mezer. Do html se bohužel z technických důvodů dostaly jen dvě, a to pevná mezera a mezera normální. Pevná mezera se zapisuje jako Normální mezera slouží jako oddělovač dvou slov. Pro výstupní zařízení je to pouze pokyn aby ta dvě slova nějakým způsobem rozdělila. Pevná mezera je součástí daného řetězce a výstupní zařízení mezi danými slovy pouze vytvoří prostor, obě slova zůstanou na stejném řádku.

Mezery tobě chybí mezi jednotkou a číslem, tedy pokud máme něčeho sedmdesát procent tak by to mělo být zapsáno ve zdrojovém kódu takto: 70 % Další věcí je, že podle pravidel českého jazyka, jak nás učili paní učitelky na základní škole, se nesmí objevit jednopísmenná spojka či předložka na konci řádku. Tedy veškerá jednopísmenná slova oddělujeme pevnou mezerou: v lese

Historický vývoj dal vzniknout i možná stovkám různých znakových sad. Nejznámější z nich je asi znaková sada ASCII, která definovala 128 znaků, jež zahrnovaly písmena anglické abecedy, číslice, interpunkční znaménka a pár dalších speciálních znaků. Znaková sada ASCII tak bylo vhodná pro psaní textů v angličtině, pro psaní kódu programů apod. Nešlo v ní však psát například české texty, protože chyběly znaky s diakritikou.

Vzniklo tak mnoho znakových sad, které jsou rozšířením ASCII - definují celkem 256 znaků. Prvních 128 znaků je shodných s ACII a druhých 128 může být použito právě pro národní znaky. Pro češtinu takových znakových sad existovalo několik, v dnešní době se používají zejména znakové sady ISO Latin 2 (ISO 8859-2) a Windows CP 1250.

Ukázka definice kódu znaků pro různé znakové sady
ZnakKód v ASCIIKód v ISO Latin 2kód ve Windows CP 1250
A656565
á - 225225
Ž - 174142

Znaková sada definuje repertoár dostupných znaků a jejich číselných kódů. Abychom mohli test v nějaké znakové sadě uložit do souboru nebo přenést po síti, musíme jednotlivé kódy znaků převést na posloupnost bajtů, protože právě bajty jsou základní jednotkou, do které se ukládají informace v souborech nebo se posílají po síti. Způsobu převodu se číselného kódu znaku do posloupnosti bajtů se říká kódování. Protože historické znakové sady ASCII, ISO Latin 2 nebo Windows CP 1250 obsahovaly maximálně 256 znaků, šlo jako zakódování použít obyčejnou identitu. Číselný kód znaku se rovnou zapsal jako jeden bajt a bylo vystaráno.

Problém znakových sad jako ISO Latin X a CP 125X byl v tom, že navrženy pro ukládání textů v omezené množině jazyků. Kdybychom měli například text, který míchá češtinu s ruštinou (která používá azbuku), neměli bychom k dizpozici žádnou znakovou sadu, která by zahrnovala jak české znaky s diakritikou, tak i azbuku. S postupnou liberalizací a rozšiřováním počítačů vůbec začal být tento stav neudržitelný. Logickým východiskem proto bylo vytvoření univerzální znakové sady, která by zahrnovala znaky všech běžně používaných jazyků. P5í jejím použití by pak bylo možné v textu používat libovolný v ní definovaný znak a bez problémů tak míchat texty i v zcela odlišných jazycích. Tato univerzální znaková sada vznikla na začátku 90, let minulého století a jmenuje se UNICODE. Je navrážena tak, aby byla schopná reprezentovat více jak jeden milión znaků. I když v dnešní době je definováno "jen" 96382 znaků.

V Následující tabulce vidíme, jak vypadají definice znaků a jim odpovídajících číselných kódů ve standardu.Z tabulky je patrné, že znak "ě" má k´do 11B v šestnáctkové soustavě. Pro označení znaku s určitým číselným kódem se často používá syntaxe U+XXXX, kde XXXX je právě kód znaku vyjádřený v šestnáctkové soustavě. Písmeno "ě" tak můžeme v této notaci zachytit jako U+011B.

Rozsah kóduČíselný kód UNICODEVýsledný počet bajtůVýsledné zakódování do UTF
U+0000-U+007F0000000000 0000000000 0xxxxxxx10xxxxxxx
U+0080-U+07FF0000000000 0000000yyy yyxxxxxx2110yyyyy 10xxxxxx
U+0800-U+FFFF0000000000 zzzzyyyy yyxxxxxx31110zzzz 110yyyyy 10xxxxxx
U+10000-U+10FFFF000uuuuu zzzzyyyy yyxxxxxx411110uuu 10uuzzzz 10yyyyy 10xxxxxx

Jako u jakékoliv jiné znakové sady, i číselné kódy znaků Unicode musíme pro účely převodu do počítačové reprezentace převést na posloupnost bajtů. Vzhledem k velkému počtu znaků není příliš vhodné používat kódování v podobě identity, kdy se kód znaku zapisuje přímo beze změň. Takové kódování existuje a jmenuje se UTF-32, ale prakticky se nepoužívá. Jeden znak se zapíše do čtyř bajtů, ve kterých přímo reprezentuje číselný kód znaku. Jedná se tedy o velice neúspornou reprezentaci textu.

Existují proto úspornější kódování UTF-8 a UTF-16. S nimi se v praxi setkáme často, například proto, že se jedná o preferovaná kódování pro dokumenty XML.

UTF-8

Podívejme se nejprve podrobněji na kódování UTF-8, které se dnes v prostředí internetu nejčastěji používá pro kódování textu v Unicode. Zvláštností UTF-8 je to, že jeden znak se může zakódovat do proměnlivého počtu bajtů (od jednoho do čtyř). Navíc je UTF-8 nevrženo tak, aby bylo zpětně kompatibilní s ASCII. Máme-li tedy v Unicode text obsahující jen znaky z ASCII a zapíšeme jej v kódování UTF-8, vypadá výsledný soubor stejně, jako by byl rovnou vytvořen v ASCII. Je to možné díky tomu, že prvních 128 znaků Unicode bylo převzato z ASCII a UTF-8 ej přímo jako odpovídající jednobajtovou hodnotou.

Obsahuje-li text znaky Unicode s kódy většími něž 128, jsou tyto znaky reprezentovány jako několik bajtů, mezi které se po jednotlivých bitech rozdělí hodnota číselného kódu znaku. Jak probíhá převod kódu znaku na sekvenci bajtů v UTF-8.

Jak lze tuto tabulky využít pro kódování textu do UTF-8, si ukážeme na jednoduchém příkladě. Předpokládejme, že chceme do UTF-8 uložit text "á - " (malé písmeno "á", mezeru a pomlčku). Nejprve musíme zjistit, jaké jsou kódy těchto znaků v Unicode. Zjistíme. že se jedná o znaky s kódy U+OOE1, U+0020 a U+2014. Už z toho je patrné, že první' znak se zakóduje clo dvou bajtů, druhý do jednoho a třetí dokonce do tří bajtů. Nyní si stač kódy znaků převést do dvojkové soustavy a podle tabulky provést zakódování do UTF-8:

á (U+00E1) = 00000000 11100001 -> 11000011 10100001 = C3 A1
  (U+0020) = 00000000 00100000 -> 00100000 = 20
- (U+2014) = 00100000 00010100 -> 11100010 10000000 10010100 = E2 80 94

vidíme, že text „á —" se do UTF-8 zakóduje jako posloupnost bajtů C3 AI 20 E2 80 94. Dekódování probíhá přesně opačným způsobem. Uvidíme-li v nějaké aplikaci podivný text, kde se budou vyskytovat znaky jako „Á", „Á" a „L" následované dalším nesmyslným znakem, znamená to obvykle, že si soubor uložený v kódování UTF-8 prohlížíme pomocí programu, který neumí provést správné dekódování sekvencí bajtů UTF-8 zpět na Unicode prky a tyto znaky následně zobrazit.

UTF-16

Kódování UTF-16 je podstatně jednodušší než UTF-8. Je-li kód znaku menší než 65536, zapíše se v kódování UTF-16 jako jedno 16bitové slovo (2 bajty). Je-li kód znaku vyšší, zapíše se jako dvě 16bitová slova, do kterých se rozdělí bity z původní hodnoty podobně jako u UTF-8.

110110ww wwxxxxx 110111xx xxxxxxxx11
Rozsah kódů Číselný kód Unicode Počet bytů Výsledné zakódování do UTF-16
U+0000-U+FFFF xxxxxxxx xxxxxxxx 2 xxxxxxxx xxxxxxxx
U+10000-U+10FFFF 000uuuuu xxxxxxxx xxxxxxxx 4

Platí přitom,že wwww = uuuuu - 1

Zajímavé je, že Unicode nedefinuje žádné znaky s kódy mezi U+D800-U+DFFF, takže nedojde k nejednoznačnosti při kódování znaků do dvou 16bitových slov. Případům, kdy se kóduje do dvou 16bitových slov, se říká náhradní páry (surrogate pairs).

Pojďme si nyní ukázat, jak by se clo UTF-16 zakódoval text „á — ". Protože žádný z těchto tří znakŮ nemá kód vyšší než 65535, použije se vždy uložení do jednoho l6bitového slova.

á (U+00e1) - 00 E1
  (U+0020) - 00 20
- (U+2014) - 20 14

Text tedy bude uložen jako posloupnost bajtů 00 El 00 20 20 14. Jenže ve skutečnosti to není tak jednoduché. Historicky existuji dva způsoby ukládám 16bitových hodnot do paměti počítače. Jedné se říká velký endián (big endian) a v paměti jsou dva bajty 16bitové hodnoty uloženy v pořadí, které odpovídá jejich lidskému zápisu. Tento zápis je použit v příkladu.

Druhá metoda označovaná jako malý endián (little endian) ukládá nejdříve méně významný bajt 16bitové hodnoty a pak ten více významný. V tomto případě by byl náš text zakódován jako El 00 20 00 14 20. Aby aplikace, které čtou text v UTF-16, mohly mezi těmito dvěma variantami rozlišit, vkládá se na začátek souborů uložených v UTF-16 speciální znak U+FEFF, tzv. BOM (Byte Order Mark). Podle toho, zda soubor začíná sekvencí bajtů FE FF, nebo FF FE, můžeme snadno poznat, o jakou z variant UTF-16 se jedná. Není-li BOM v textu přítomen, musí být pořadí bajtů patrné z názvu kódování- hovoříme pak o kódování UTF-16BE, resp. UTF-l6LE.

Některé aplikace vkládají znak BOM i do textu uloženého v UTF-8, kde je to zcela zbytečné protože UTF-8 dovoluje jen jedno pořadí bajtů. Vkládání tohoto znaku má však nepříjemné vedlejší účinky na interpret PHP.

Kódování UTF-16 je sice jednodušší než UTF-8, nicméně pro přenos a ukládání dat se v internetu příliš nepoužívá, protože není zpětně kompatibilní s ASCII. Navíc pro texty v angličtině a v jazycích, které nepoužívají příliš často znaky naci rámec ASCII, je zápis v UTF-16 skoro dvakrát delší než v UTF-8. Nicméně UTF-16 je zase snazší na zpracování, a proto se v mnoha prostředích používá pro interní reprezentaci řetězců. UTF-16 používají vnitřně například Windows, Jáva nebo .NET.

*Převzato z knihy XML a PHP, Kosek Jiří

http://en.wikipedia.org/wiki/Latin_characters_in_Unicode

http://cs.wikipedia.org/wiki/Znaková_sada


upravit odstranit css

NAVRCHOLU.cz