Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 4 - Babylonské zmatení kódování

V minulé lekci, Reprezentace čísel v počítači, jsme se zabývali reprezentací čísel v počítači. Dnes se budeme bavit o reprezentaci textu. Jak asi tušíte, problematika bude rovněž komplikovaná :)

Určitě znáte biblický příběh babylónského zmatení jazyků, lidé si nerozuměli. Měli pošramocený komunikační kanál. Co je na tomto příběhu odstrašující, je, že se to bohužel v dnešním světě počítačů děje také. Na úvod si ukažme ochutnávku kódování různých mezinárodních znaků v různých znakových sadách:

Guláš ve znakových sadách - Principy fungování počítačů

Použijme ASCII

Jako první použijeme kódování ASCII. To je zkratkou pro American Standard Code for Information Interchange. V první sadě ASCII z roku 1963 šlo jen o to poslat nějaké znaky, takže neobsahovala ani malá písmena. To v roce 1967 trochu napravili. Pokud jste ale aspoň trochu zběhlí v počítačové historii, tak víte, že tehdy byla paměť počítačů velmi omezená a panovala touha ušetřit každý bit (v dnešní gigabytové době nepředstavitelné), takže ASCII sada byla 7-bitová. Mohli jste tedy reprezentovat celkem až 127 znaků, což je pro znaky 0-9, A-Z, a-z a speciální symboly v anglické abecedě celkem dost. Základní ASCII tabulka je vidět na obrázku níže:

Základní ASCII tabulka - Principy fungování počítačů

S rozvojem komunikačních protokolů dohodami, jak se budou posílat bajty, se přišlo na to, že by se měl posílat znak po 8-mi bitech. Najednou bylo možné posílat 256 znaků. Jak je doplnit?

Problémy začínají

Maďarsko, Polsko, Česko, Francie, Rusko a další země na světě napadlo, že by si do nové poloviny ASCII sady, tzv. extended části, mohli dát svoji vlastní abecedu. Samozřejmě několik lidí na světě napadlo, že by mohli posílat třeba i srdíčka, smajlíky a další. No a najednou jsme měli hromadu nezávislých a nekompatibilních kódování. Přesně to, co jsme nechtěli. Proto si spousta lidí řekla, že udělají své vlastní, lepší kódování, např. Windows 1250 (pro Windows), Latin 2 (pro UNIX)... zhýralost, prostopášnost a mamon ve světě.

UNICODE

První celosvětová snaha o řešení je 32-bitové Unicode. Tzn. lze reprezentovat až 4 294 967 295 znaků a i když je jich pár zakázaných (kolem 2047), lze v Unicode reprezentovat japonštinu, klingonštinu, elfštinu, čínštinu, ruštinu a hieroglyfy. A zbylo nám ještě vážně hodně místa, kdyby přilétli mimozemšťané a chtěli si s námi psát emaily. Unicode je však jen seznam znaků, nedefinuje jak máme znaky v paměti uložit. To řeší následující kódování: UTF-32, UTF-16, UTF-8, UCS-2...

UTF-32

Máme formát, který je 32-bitový, tak budeme každý znak psát na 4B. Pro každý znak tak máme stejný počet nul a jedniček. Ale má to háček. Například se příliš plýtvá místem. V ASCII jsme na každý znak použili 1B. Pokud jsme Angličané a píšeme celý život romány, bohatě nám stačí ASCII a s každým znakem jinak zahodíme 3B. I kdybychom napsali román, kde Klingoni přistanou mezi pyramidami a přivítá je faraon, který v hieroglyfech sesílá prastarou elfskou magii, sotva nám znak zabere více než 3B. Formát je příliš robustní.

UCS-2

Řekněme si, že nepotřebujeme klingonštinu ani elfštinu a budeme na jeden znak používat jen dolních 16 bitů (2B). Zas ale nelze napsat román o setkání Faraona s kapitánem Kirkem v dobové řeči... Přijdeme tím o polovinu abecedy.

UTF-16

Zkusme na to jít jinak. Pro znaky 0 – 65535 budeme používat 2B, pro vyšší 4B. Jak ale počítač pozná, zda je to 4B znak, nebo dvakrát 2B za sebou? Pomůžou nám pro to zakázané znaky. Ty jsou něčím jako (mezičlánek), tzn. že počítač ví, že po jeho přečtení musí přečíst ještě další znak. Říká se jim tzv. surrogate – zástupce. 4B znak je v podstatě kombinací dvou surrogate za sebou. Samy o sobě nemají význam, ale když se jejich hodnota zkombinuje, adresují celý prostor znaků.

UTF-8

Proč je tu ještě UTF-8, když to vypadá, že je UTF-16 ideální? Dobře... Někdo měl stále pocit, že se plýtvá pamětí a tak si řekl, že by se něco mohlo indexovat 1B, 2B, 3B a něco 4B. A teď... jak je odlišit?

No, 1B musí začínat 0, protože znaky z ASCII jsou od 0 do 127 a my chceme UTF kompatibilní s ASCII sadou. Právě tyto znaky chceme indexovat 1B, atd... Vždy logicky vyřadíme nižší řád a první logicky možný je řád, který chceme.

Zde je vidět, jak řetězec několika speciálních znaků vyjádříme v různých Unicode kódováních:

Vyjádření řetězce v kódování Unicode - Principy fungování počítačů

Svět Unicode

Začali jsme s tím, že chceme sjednocovat a ve výsledku máme jen další hromadu znakových sad? Ale dobře, už je to trochu lepší. Problémy by mohly přestat... nebo také ne :)

Směr textu

Chceme si dopisovat s kamarádem z Tel Avivu a máme opačný směr textu? Co s tím, že my píšeme zleva doprava a on zprava doleva? Dobře, můžeme si říci, že na začátku každého textu bude nějaká magická konstanta, která nám řekne směr textu? Dobře..., co když ale chceme psát emaily v angličtině a jména měst v hebrejštině? Takže máme text, který má v sobě další text v jiném směru, takto: ->->->->->-><-<-<-->->->->->... Existují tedy kontrolní znaky. Ale ty nejsou ve standardu, může to být cokoliv...

TEXT - Principy fungování počítačů

Textu si nevšímejte :)

Kombinované znaky

Chceme uložit znaky jako á, což je znak a + ´ (a + čárka), ď pak je d + ˇ (d + háček) atd... Toto jsou tzv. kombinované znaky. Znak můžeme zkombinovat z mnoha dalších. Jenže některé znaky se používají tak často, že se pro ně vymyslela zkratka jako znak jeden. Takže najednou porovnáváte řetězce, které mají být stejné, ale v bitovém zápisu pak není á uložené jako a + ´.

Endianita

A zas přišla slavná endianita. Každý počítač může mít pořadí bajtů opačné a text může najednou vypadat úplně jinak...

Konce řádků

Kdyby toho nebylo málo, tak i když máme stejné kódování i stejnou endianitu, přesto můžeme narazit s konci řádek.

Dříve se psalo na psacích strojích. Zkuste se vžít do té atmosféry, slyšíte klapat prstíky, pak najednou ticho. Skrt, kkkkkr, a nanovo. Když pisatel dopsal, otočil válec, posunul na začátek a psal odznovu.

Psací stroj - Principy fungování počítačů

Udělaly se tedy znaky CR a LF, které označují Carrige Return (návrat tiskové hlavy) a Line Feed (posun papíru o řádku). Proto se usneslo, že se budou konce řádek psát jako CR, LF. Na konci řádek jsou tedy vždy 2 znaky. Tedy...byly. Windows používá tuto kombinaci stále, ale někdo se na to podíval a řekl... Nepotřebujeme přeci 2 znaky, stačí nám jeden. A tak si vybrali... každý něco jiného. Windows má CRLF, UNIX má LF a MacOS má CR. Takže když pošlete dokument z Windows do Linuxu a zkontroluje jej někdo třetí na MacOS, tak vás při editaci textu čeká hezké odpoledne...

Co z toho?

Snahy sjednotit byly nakonec odměněny jen částečně. Unicode se rozdrobil a jednotlivé platformy se liší tím, co kde používají. S tím souvisí i to, jak budete číst soubory a do nich zapisovat. Velmi výstižně to vystihl jeden komentář:

Je ostudou, že v 21. století ještě nemáme vyřešené jednotné zobrazování znaků.

Man Thinks - Principy fungování počítačů

Malá třešnička na závěr

Když už jsme mluvili o speciálních znacích, konec řádky nevidíte. Ten si prostě nevytisknete. Jakmile byste chtěli vytisknout konec řádky, program by sám odřádkoval. Teď si vezměte, že existuje něco jako EOF, neboli End Of File. Zkusíte si ho představit? To ani nejde! Jakmile by někdo do nějaké učebnice napsal, jak vypadá EOF, v ten moment by učebnice skončila :)

V příští lekci, Architekte, kam jsem si ten výpočet uložil...?, se budeme věnovat pamětím.


 

Předchozí článek
Reprezentace čísel v počítači
Všechny články v sekci
Principy fungování počítačů
Přeskočit článek
(nedoporučujeme)
Architekte, kam jsem si ten výpočet uložil...?
Článek pro vás napsal Ondřej Michálek
Avatar
Uživatelské hodnocení:
57 hlasů
Autor se věnuje teoretické informatice. Ve svých volných chvílích nepohrdne šálkem dobrého čaje, kaligrafickým brkem a foukací harmonice.
Aktivity