Geek tričko zdarma Geek tričko zdarma
Hledáme grafika na pohodovou brigádu v Blenderu nebo programátora na hry v PyGame. Máš zájem? Napiš nám na redakce [zavináč] itnetwork.cz!
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

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

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

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

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

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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

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

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

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

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.


 

 

Článek pro vás napsal Tricerator
Avatar
Jak se ti líbí článek?
3 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.
Předchozí článek
Reprezentace čísel v počítači
Všechny články v sekci
Principy fungování počítačů
Miniatura
Následující článek
Architekte, kam jsem si ten výpočet uložil...?
Aktivity (4)

 

 

Komentáře

Avatar
Tomáš Kuncl:19. dubna 23:46

Celkem hezky sepsané, jen ta hrubka mě prostě dráždí...

 
Odpovědět  +2 19. dubna 23:46
Avatar
Tricerator
Redaktor
Avatar
Odpovídá na Tomáš Kuncl
Tricerator:19. dubna 23:56

Je možné, že nám při tvorbě a editaci unikla. Stačí napsat a dá se opravit. Napiš kde a do druhého dne je to v pořádku.

Odpovědět 19. dubna 23:56
Raduj se z bugu. Tedy z toho, ktery jsi uz nasel...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš Kuncl
David Čápka:20. dubna 13:24

To jsem byl nějak rozvášněný z toho babylonský :-D Opraveno.

Odpovědět  +1 20. dubna 13:24
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
ostrozan
Redaktor
Avatar
ostrozan:21. dubna 6:19

Možná by se hodilo doplnit, že (dnes už snad každý) textový editor nám, pokud chceme ukazuje "bílé (netisknutelné) znaky" - tedy CR, LF, ale třeba i TABulátor, nebo zmiňovaný směr psaní.
Ale textové editory a stejný "Babylon" s nimi spojený by si jistě zasloužily vlastní článek.

 
Odpovědět  +1 21. dubna 6:19
Avatar
mixxy
Člen
Avatar
mixxy:21. dubna 14:00

Dobře napsaný text. Btw pro korekci textu z win->unix staci otevit soubor ve vi a dat
:%s/ctrl-v shift-M//

A mas krasne upravene konce ;-)

Odpovědět  +4 21. dubna 14:00
Neni dulezite mnoho vedet a znat. Dulezite je vedet, co je treba.
Avatar
Jan Procházka:2. května 10:51

A i když máme všechno sesynchronizované: kódování, endianitu, konce řádků, konce souborů, menstruační cyklus,...

Program exportující data podle (původní) smecifikace .csv vytvoří krásný záznam měření a člověk si jej otevře v českém excelu...

 
Odpovědět  +2 2. května 10:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.