Ultimátní průvodce znakovými sadami. Co je to Windows-1250, ISO-8859-2, UTF-8 a další peklo, které nás trápí celé roky

Jak se kóduje digitální informace na počítači | Proč občas zlobí diakritika v titulcích a vypisují se jiné znaky | Co přesně se skrývá pod zkratkami UTF-8 nebo třeba Windows-1250?

microsoft, windows, microsoft, ultimátní průvodce znakovými sadami. co je to windows-1250, iso-8859-2, utf-8 a další peklo, které nás trápí celé roky

Ultimátní průvodce znakovými sadami. Co je to Windows-1250, ISO-8859-2, UTF-8 a další peklo, které nás trápí celé roky

Dnes se pokusíme prakticky a formou obrázků vysvětlit, jak se kóduje text na počítači. Tento fenomén totiž už několik desítek let trápí nejednoho majitele PC, který sice mnohokrát slyšel o jakémsi ASCII, ISO-8859-2, Windows-1250 a v posledních letech hlavně o UTF-8, ale možná úplně netuší, co se za těmito zkratkami skrývá a jak to vlastně celé funguje.

Co je to bit

Začněme od úplného začátku, ale nebojte se, bude to jen první stručná kapitola.

V digitální éře 21. století ukládáme na počítačích jakoukoliv informaci ve formě dvou rozlišitelných stavů, kterým říkáme bit. Čtyři bity tvoří půlbajt (tzv. nibble) a dva půlbajty jeden bajt.

Na fyzikální úrovni bychom mohli vytvořit bit třeba pomocí dvou odlišných elektrických napětí. Jedno bude vyšší a druhé nižší. Kdybychom měli po ruce osm světýlek a poskládali bychom je do dvou řad po čtyřech (tedy dva půlbajty pod sebou), celý bajt by pak vypadal jako na obrázku výše. Všimněte si, že svítí jen jedno světýlko úplně na konci a všechny ostatní bity jsou zhasnuté.

Když teď vysoké (zapnuté) a nízké (zhasnuté) stavy bitu nahradíme numerickými hodnotami 1 a 0, bajt na obrázku budeme moci vyjádřit číselnou hodnotou:

0000 0001

Se kterou už můžeme provádět matematické operace v binární soustavě. Začátečníkům pomůže třeba kalkulačka ve Windows 10/11, která má docela povedený režim pro vývojáře, v němž můžete intuitivně zapínat a vypínat jednotlivé bity podobně jako naše lampičky a sledovat, co se stane.

256 celých čísel v jednom bajtu

Pokud si ze školy matně vzpomínáte na kombinatoriku, tak možná víte, že když máme osm bitů (k), z nichž každý může nabývat dvou stavů (n), složíme z nich dohromady nk variací s opakováním.

Jeden bajt s osmi bity proto pojme 28 (tedy 256) možných variant bitů, které mohou představovat třeba 256 celých čísel v rozsahu 0 až 255.

Do jednoho jediného bajtu pak můžeme uložit jak informaci o barvě pixelu s až 256 odstíny, tak informaci, že má tentýž bajt představovat třeba jeden z 256 možných textových znaků.

Skvělé, už víme, proč osm bitů, tedy jeden bajt, pojme právě 256 různých hodnot, no a v následujících kapitolách si vysvětlíme, jak tyto hodnoty proměnit ve viditelné znaky na obrazovce. Třeba ty, které právě teď tvoří tento článek.

Základem většiny znakových systémů v posledních šedesáti letech je American Standard Code for Information Interchange – ASCII. A právě na ASCII se podíváme v druhé kapitole

Americká znaková sada ASCII

Pokud chceme do bajtů ukládat textové znaky, musíme se nejprve všichni domluvit na tom, jaká čísla jim přidělíme. Slouží k tomu kódová tabulka – znaková sada (anglicky charset).

Počítačová revoluce v druhé polovině 20. století naplno propukla v USA, není tedy divu, že tehdejší první znakové tabulky používaly zpravidla jejich anglickou abecedu a sloužily třeba v dálnopisech.

Nejúspěšnější sadou, od které se odvíjí i drtivá většina všech ostatních, se zrodila v 60. letech minulého století a jmenuje se American Standard Code for Information Interchange – ASCII. Jelikož používá pouze 7 bitů, skládá se ze 128 řídících a tisknutelných znaků.

V každé buňce je vždy tisknutelný znak (zeleně), nebo zkratka toho řídícího (červeně), a pod ním jeho pořadí v tabulce pro přehlednost jak v desítkovém, tak šestnáctkovém zápisu.

Jak vidno, vidíme celou abecedu bez diakritiky, čísla, zavináč, závorky… A mezi řídícími/netisknutelnými znaky třeba posunutí kurzoru na začátek řádku CR – Carriage Return (pozice 13) a zalomení řádku LF – Line Feed (pozice 10).

Už se v tom ztrácíte? Nebojte se, v další kapitole si ukážeme, jak to bude vypadat, když v kódování ASCII uložíme text:

PES

PES

Ukládáme dva psy v ASCII

Dejme tedy domu, že chceme uložit dva řádky textu do souboru ascii.txt a v kódování ASCII. Na tom prvním bude slovo PES, za kterým budou následovat řídící znaky CR a LF, které počítači říkají, že se má kurzor přesunout na začátek dalšího řádku. Na závěr opět uložíme PES.

Poznámka: Většina operačních systémů a programů dnes provede odřádkování s přesunutím kurzoru na začátek, i když narazí pouze na LF, ale nekomplikujme to. 

Jak už jsme si řekli výše, počítačový procesor a paměť nepracují s žádnými písmeny, ale s bity a bajty. V souboru ascii.txt tedy ve skutečnosti nejsou uložené znaky, ale bajty s numerickým kódem znaku podle tabulky ASCII.

Když se podíváte na převodní obrázek výše, v souboru by tedy měla být řada bajtů s těmito dekadickými hodnotami:

80, 69, 83, 13, 10, 80, 69, 83

Protože ale v digitálním světě uvádíme hodnoty bajtů spíše v šestnáctkové soustavě, tak ještě jednou:

50 (P), 45 (E), 53 (S), 0D (CR), 0A (LF), 50 (P), 45 (E), 53 (S)

Když takto uložený soubor otevřu v univerzálním prohlížeči Lister, který je součástí správce souborů Total Commander, ale stáhnout jej můžete i samostatně, v textovém režimu uvidím dva řádky se psy, ale v tom binárním skutečné hodnoty bajtů v šestnáctkovém zápisu. A je to přesně ta řada, kterou jsme si napsali v předchozím odstavci.

Výborně, už rozumíme ASCII, tato základní a historická znaková sada nicméně stačila leda tak v USA. Co ale nebozí Evropané se svojí diakritikou? A kam ty další znaky vůbec vtěsnat?

To si ukážeme v další kapitole, ve které se seznámíme se znakovou sadou ISO-8859-1

Západoevropská znaková sada ISO-8859-1

V dřevních dobách počítačů, kdy šlo při ukládání informací o každý volný bit, se kódová tabulka ASCII náramně hodila, oněch 128 možných znaků totiž při přenosu okupovalo pouze 7 bitů (2⁷ = 128) a do slovníku se vešla celá anglická abeceda a hromada pomocných řídících povelů pro dálnopisy a terminály té doby.

Jenže co čert nechtěl, od 70. let minulého století se počítače masivně prosazují také v Evropě a pro potřeby práce s textem se proto zrodila celá plejáda alternativních národních tabulek. Jsou už osmibitové – okupují celý bajt – a základní ASCII doplnily o znaky s diakritikou z germánských a románských jazyků.

V 80. letech na jejich základě vzniká „západoevropské“ kódování, které už známe jako mezinárodní standard ISO-8859-1.

Slovo PÓL v ISO-8859-1

Jak je patrné z obrázku výše, červenozelený základ původního ASCII rozšiřuje nejprve o místo pro případné další řídící znaky (v praxi se nepoužívají) a modrou oblast plnou písmenek s diakritikou a dalších symbolů. ISO-8859-1 je díky tomu zpětně kompatibilní s ASCII.

Kdybychom chtěli v kódování ISO-8859-1 uložit do souboru iso88591.txt slovo PÓL, na disku bude tentokrát ve skutečnosti uložená sekvence bajtů s šestnáctkovými hodnotami:

50 (P), D3 (Ó), 4C (L)

Pokud bychom takto uložený text otevřeli na systému, který podporuje jen americké ASCII (a jednotlivé znaky čte jako celé bajty), zobrazí se pouze PL. P a L totiž mají v obou tabulkách stejné adresy a znak Ó ASCII nezná, protože se nachází až na 211. pozici – daleko nad jeho horní hranicí 128.

Chybí české háčky

Chybělo málo a kódování ISO-8859-1 by stačilo celému západnímu světu včetně zemí střední Evropy. Když se ale podíváte lépe, v tabulce budete marně hledat třeba znaky s českými háčky.

Sada ISO-8859-1 nemá na seznamu třeba Ž, no a kvůli tomu v ní nedokážeme uložit slovo ŽIRAFA.

Západoevropskou tabulku ISO-8859-1 proto doplnila ještě velmi podobná středoevropská varianta ISO-8859-2. Ukážeme si ji v další kapitole

Středoevropská znaková sada ISO-8859-2

Kódovací tabulka ISO-8859-2 pochází ze stejné rodiny standardů Mezinárodní organizace pro normalizaci ISO, a tak opět obsahuje původní americký základ ASCII.

Na vyšších pozicích pak ISO-8859-2 eviduje ty znaky s diakritikou z ISO-8859-1, které používáme i v našich jazycích, no a ty, které nepoužíváme, doplňuje vlastními. A protože jich máme fakt hodně, přišli jsme kvůli tomu v této tabulce třeba o znaky © a ®.

Podstatné je ale to, že už máme po ruce konečně velké Ž na 174. pozici, a tak zkusme v ISO-8859-2 uložit slovo ŽIRAFA do souboru iso88592.txt. V Listeru bychom tentokrát měli spatřit sekvenci bajtů s šestnáctkovými hodnotami:

AE (Ž), 49 (I), 52 (R), 41 (A), 46 (F), 41 (A)

Kdyby v našem kulturním okruhu a latince existovaly do nástupu systému Unicode jen tabulky z rodiny ISO-8859, bylo by všechno jednodušší. Znakových sad je ale ve skutečnosti mnohem, mnohem více. Třeba právě z toho důvodu, že v ISO-8859-2 chybí ty zatracené symboly © a ®.

V Microsoftu je chtěli mít kvůli jednotě Windows napříč jazyky, a tak tabulku ISO-8859-2 i hromadu dalších převálcoval jejich vlastní formát Windows-1250/ANSI.

A tady už začíná pořádné peklíčko! Windows-1250 si představíme v další kapitole a uvidíte, co udělá s naší nebohou žirafou

Středoevropská znaková sada Windows-1250

Středoevropská tabulka Windows-1250/ANSI se oproti ISO-8859-2 liší především v tom, že až na pár výjimek vyplňuje oblast mezi 128. až 159. znakem, která se v ISO nepoužívá.

Díky tomu se našlo místo na české uvozovky, znak eura a hromadu dalších lumpáren. A navíc si na obrázku níže všimněte, že už máme k dispozici opět © a ®. Sedmibitová zelená oblast 0. až 127. znaku zůstává i zde kompatibilní s ASCII.

Uložíme-li v Poznámkovém bloku slovo ŽIRAFA ve formátu Windows1250/ANSI, v Listeru bychom nyní měli vidět řadu surových bajtů:

8E (Ž), 49 (I), 52 (R), 41 (A), 46 (F), 41 (A)

Není ŽIRAFA jako ®IRAFA

Kvůli rozšíření modré oblasti nahoru se nám mnohé znaky zvláště s českou diakritikou přeskládaly, takže když se naopak pokusím otevřít soubor z předchozí kapitoly kódovaný v ISO-8859-2, uvidím ®IRAFA.

Jak je to možné? Je to prosté, Poznámkový blok totiž podporuje jen kódování Unicode (o něm později) a právě svoji rodinu tabulek Windows/ANSI.

Je tedy zřejmé, že sady ISO-8859-2 a Windows-1250 se liší mimo jiné právě v adrese znaku Ž. Tabulka níže ukazuje rozdíly obou systémů. Černé znaky jsou v obou tabulkách stejné a ty šedé se liší a na těchto adresách je najdeme jen ve Windows-1250.

Právě tento rozdíl v posledních dvou dekádách způsobil problémy třeba při zobrazování komunitou vytvořených titulků k filmům, které byly jednou kódované ve formátu ISO, podruhé ve Windows/ANSI – prostě tak, jaký software k jejich tvorbě a na jaké platformě titulkář zrovna použil a jakou ve výchozím stavu zvolil samotný přehrávač videa na PC, televizoru atp.

Dost bylo osmibitů

Kódovací tabulky ISO-8859 a Windows/ANSI vznikly z dnešního úhlu pohledu v dřevních dobách osobních počítačů, a tak jim podobný myšmaš nemějme za zlé. Podstatné je to, že se snad už brzy stanou jen vzpomínkou na minulost.

A to hlavně díky masivnímu nástupu internetu, který je dostupný nejen v Los Angeles a na návsi v Kozojedech, ale také Thajsku, Japonsku, subsaharské Africe a v ořezané podobě dokonce i v Číně a Rusku.

Na scéně se proto rázem objevily desítky a stovky nových znaků a symbolů z všemožných abeced, o jejichž existenci běžný smrtelník neměl ani tušení, no a v posledních letech nakonec také emoji.

Abychom dokázali uložit i takové pitomosti jako třeba znaky nemrtvé ženy a muže – tedy🧟‍♀️🧟‍♂️ –, osmibitové kódovací tabulky s 256 možnými adresami nám už rozhodně stačit nebudou.

A tak se zrodil Unicode a rodina UTF, kterými v závěrečné kapitole uzavřeme tento článek

The Unicode Standard

Co kdybychom namísto omezených lokálních znakových sad vyrobili jednu společnou, která bude evidovat úplně všechny myslitelné tisknutelné symboly světa?

Tedy, raději ne úplně všechny myslitelné – o tom, kdo se dostane na seznam, rozhodne spíše nějaká důvěryhodná autorita, ve které budou mít podíl všichni klíčoví hráči.

A tak se zrodila obří tabulka Unicode a stejnojmenná neziskovka, jejíž pracovní skupiny rok co rok vybírají, co všechno bude na seznamu. Členy konsorcia najdete zde a nechybí mezi nimi velká čtyřka Apple, Google, Meta a Microsoft. Pokud chcete vlastní emoji, napište jim na podporu.

Prostě přidáme další bity

Poslední verze Unicode 15.1 z loňského roku čítá úctyhodných 149 913 znaků, které se nám už do osmibitového kódování rozhodně nevejdou, a tak se prostě šířka adresy znaku roztáhla až na 32 bitů (4 bajty). Prvních 256 znaků má ale stejnou adresu jako ISO-8859-1, čili jsou opět zpětně kompatibilní.

Celou tabulku Unicode si tentokrát neukážeme, shořel by vám totiž počítač, a spokojíme se jen s prvními 512 znaky. Zároveň už místo dekadického čísla vypisujeme adresu (pořadí) v šestnáctkovém zápisu a v šestnáctibitové šířce.

Ani šestnáct bitů (tedy dva bajty) by nám ale pro celý Unicode nestačilo, protože 216 pojme jen 65 536 možností. Celý rozsah je ke všemu rozdělen na tematické bloky, takže emoji jsou ještě mnohem výše. Naše generická bezpohlavní zombie je až na 129503. pozici (1F9DF) a nemrtvého muže či ženu z ní udělají až další modifikátory ve formě nám neviditelných dodatečných znaků.

ŽIRAFA v UTF-16

Unicode se v praxi kóduje hned několika způsoby – zpravidla některým ze systémů UTF (Unicode Transformation Format). Jeden z nich se jmenuje UTF-16 a po dnešní intelektuální masáži už nejspíše tušíte, že bude ukládat Unicode v šestnáctibitovém formátu stejně jako ve výřezu tabulky výše.

Znak A, který má v osmibitovém ISO-8859/Windows hexadecimální adresu 41 a zabírá tedy jeden bajt, bude mít v UTF-16 adresu 0041 a zabere dva bajty. Písmeno Ž má zase v Unicode adresu 17D (vešlo se nám i do našeho výřezu), takže slovo ŽIRAFA z předchozích kapitol by v UTF-16 a šestnáctkovém zápisu vypadalo takto:

017D (Ž), 0049 (I), 0052 (R), 0041 (A), 0046 (F), 0041 (A).

V souboru uloženém jako UTF-16 v Poznámkovém bloku Windows nicméně na začátku narazíme ještě na symbol FEFF, což je tzv. BOM – Byte Order Mark. Dává programu vědět, v jakém pořadí se mají jednotlivé dvojbajty číst. Jestli zleva, nebo zprava.

Suma sumárum, nebohá ŽIRAFA sežrala včetně hlavičky BOM 14 bajtů! V kódování ISO-8859-2 a Windows-1250 by to bylo jen 6 bajtů!

UTF-8

Pokud by šlo jen o jednu žirafu, až takový problém by to nebyl, texty jsou ale zpravidla mnohem delší a v textovém HTML je hlavně naprogramovaný celý World Wide Web.

Všechny webové stránky kódované v UTF-16, kde každý Unicode znak zabírá nejméně 16 bitů (znaky z vyšších adres pak 2×16 bitů), by proto byly dvakrát rozměrnější!

Není tedy divu, že byl nástup Unicodu kvůli pomalému připojením a tehdejším slabším počítačům zprvu pomalý a vše se změnilo až díky UTF-8, které je dnes prakticky synonymem kódování textu na webu i na mnoha operačních systémech.

Určitým hybridem už zůstávají snad jen Windows, které ještě stále všemožné kombinují UTF-16 s UTF-8. V obou případech je to tentýž Unicode ve smyslu pořadí znaku v tabulce, ale jinak kódovaný.

UTF-8 používá variabilní bitovou šířku znaku. Prvních 128 znaků zabere jeden bajt, no a jak se v Unicodu posouváme výše, budou to dále dva, pak tři a čtyři. Aby dokázal čtecí program zjistit, kde začínají a končí znaky, když mají proměnlivou šířku, UTF-8 používá speciální bitové vzory identifikující začátky vyšších bajtů. Jejich smysl je už ale nad rámec tohoto článku, a tak vás odkážu třeba na Wikipedii.

Suma sumárum, když uložím slovo ŽIRAFA v UTF-8 a opět se podívám do Listeru, tentokrát už zabírá jen 7 bajtů – pouze o jeden více než v ISO-8859-2 a Windows-1250:

C5BD (Ž), 49 (I), 52 (R), 41 (A), 46 (F), 41 (A)

(Šestnáctkový zápis C5BD odpovídá na bitové úrovni adrese 17D pro Unicode znak Ž po „bitovém označkování“ pro identifikaci, kde už začíná zase znak I s adresou 49)

Uf, v nejlepším je třeba přestat, ať nikomu nepraskne hlava, příště ale získaných znalostí využijeme v praxi, budeme totiž pomocí UTF-8 kreslit české znaky na malý displej připojený k Arduinu. Získaný teoretický základ o znakových sadách využijeme v praxi.

Přečtěte si také:

OTHER NEWS

26 minutes ago

Billionaire Sir Jim Ratcliffe slams Tories for bungling Brexit

26 minutes ago

What has changed for Toulouse since last year's loss to Leinster?

26 minutes ago

4 years ago, he was working 8-5 in the US. Now, he’s playing in the Irish top flight

26 minutes ago

Billionaire defense entrepreneur Palmer Luckey has a home like a Bond villain's lair — complete with helicopters, a giant fish tank, and an underground missile base filled with video games

28 minutes ago

WA football's saviour strikes again in major Dees upset

28 minutes ago

The man hanged for printing his own ace of spades

28 minutes ago

Martin Odegaard questions 'strange' Tottenham atmosphere against Man City

28 minutes ago

Man Utd, Chelsea rank highly in worst injury record table; Newcastle top Premier League

28 minutes ago

Soccer-Arsenal must not get 'too emotional' on final day, says Odegaard

28 minutes ago

As Abhijit Gangopadhyay’s remarks spark a row, a look at BJP leaders’ jibes at Mamata

28 minutes ago

Who really owns PRIME drink? A closer look behind the brand

28 minutes ago

'I've never walked away from a fight': Eels boss Arthur

28 minutes ago

Full horror of Oklahoma teen Noah Presgrove's injuries explained - as autopsy results give chilling insight into his final moments

28 minutes ago

Where it REALLY pays to own a holiday buy-to-let: How to choose wisely and turn your second property into a goldmine

30 minutes ago

Kazakhstan’s first Paralympic champion Zulfiya Gabidullina, 58, keeps swimming to inspire others

30 minutes ago

Dangerous to view the world’s conflicts as distant and unrelated: Estonia PM Kallas

33 minutes ago

Mascot race ends in hilarious fashion with ultimate fail seeing competitor suffer embarrassing loss

34 minutes ago

Koos Bekker's net worth today: A look at SA billionaire's fortune

34 minutes ago

Water company’s response to Brixham parasite outbreak is ‘contemptible’ – MP

34 minutes ago

Why can’t America have high speed rail? Because our investment is a ‘rounding error’ compared with Europe’s, says Amtrak’s CEO

34 minutes ago

Melissa Joan Hart says she feels ‘really guilty’ for taking an underage Britney Spears to her 1st club

34 minutes ago

Brexit row erupts over control of Gibraltar’s border

35 minutes ago

'Sunak determined to cling on by his fingernails'

35 minutes ago

DIARISE: SASSA payment dates for the rest of 2024

35 minutes ago

Government ‘worried’ about pro-Palestinian marches, Shapps says

35 minutes ago

Outback cattle station the size of Yosemite transformed after massive donation: 'We really do hope this inspires other philanthropists'

35 minutes ago

Ex-Arsenal star dispels myth about Gunners 'failing' in title race ahead of final day

35 minutes ago

You'll soon be able to control Chromebooks with just your face

35 minutes ago

Josh Kroenke makes promise to Mikel Arteta ahead of Arsenal title decider

35 minutes ago

Where Premier League trophy will be stored as Arsenal and Man City face final day title drama

35 minutes ago

AI Reveals What The X-Men '97 Team Looks Like In Real Life, And It's Uncanny

35 minutes ago

The Yankees lineup is about to face a stiff test

35 minutes ago

Elon Musk launches Starlink satellite internet service in Indonesia, world's largest archipelago

35 minutes ago

The Senate filibuster is a hurdle to any national abortion bill. Democrats are campaigning on it

35 minutes ago

PGA Championship 2024 tee times: Round 4 groups and schedule including Xander Schauffele and Collin Morikawa

36 minutes ago

Man United owner Sir Jim Ratcliffe backs Keir Starmer and slates Tories on Brexit and economy

36 minutes ago

I warn everyone about two symptoms after cancer took my dad in 12 weeks

43 minutes ago

Brazil counts cost of worst-ever floods with little hope of waters receding soon

43 minutes ago

Tesla Cybertruck takes second place to Ford F-150 Lightning, new monthly registration data shows

43 minutes ago

Innocuous move that could sideline luckless Tiger

Kênh khám phá trải nghiệm của giới trẻ, thế giới du lịch