Znak, řetězec, kódování
Lekce 13
Úlohy
Parser UTF-8 (15 b)
Důležité: Rozhodl jsem se tento úkol dát jako nepovinný (je to nad rámec semináře, ale je to úloha, kterou si jistě velmi dobře procvičíte manipulaci s bity).
Naprogmujte program, který přečte soubor obsahující text. Ten zpracuje a na standardní vstup vypíše všechny znaky souboru jako UTF-8 codepointy (tedy ve tvaru U+uvxyz).
Co jsme dnes probrali
Znak
- Základní jednotkou psaného textu (řetězce) je znak
- Co to ale znak je?
- Nejmenší jednotka textu, která nese nějaký význam
- V řeči počítačů ale neznáme něco jako znak, ale jen jedničky a nuly - záleží tedy na kódování
- V dávné historii (začátky internetu) používala každá síť jiné kódování znaků
- To ale znamenalo, že spolu nebyly kompatibilní
- V šedesátých letech vzniklo ASCII (American Standard Code for Information Interchange)
- Kódovalo čísla a písmena (anglické abecedy)
- Sedmibitové -- proč?
- Problém byl, že kóduje jen znaky anglické abecedy
- Mezi šedesátými a devadesátými lety vznikla řada standardů pro kódovaní jednotlivých znaků různých abeced různých jazyků
- Pak přišlo Unicode konsorcium s tím, že by měl být jeden formát na všechny
znaky
- V devadesátých letech představili UTF-8, doteď nejpoužívanější kódování
- Jeden znak nemá fixní délku znaku, ale je proměnlivá (jeden až čtyři bajty)
- Bezproblémově kóduje ASCII jako jeden bajt
- Existují i UTF-16 a UTF-32, které se ale moc nevyužívají
- Šikovný nástroj na prohlížení Unicode znaků - https://unicode-explorer.com/
- V devadesátých letech představili UTF-8, doteď nejpoužívanější kódování
UTF-8
- Nástupce ASCII
- Umí kódovat mnohem více znaků, než ASCII
- Znaky se kódují do tzv. codepointů, ty se potom (podle svého rozsahu) kódují do binárního formátu
- Jeden znak nemá fixní délku znaku, ale je proměnlivá (jeden až čtyři bajty)
- Tabulka pro kódování a dekódování zde
- Příklad: dekódujte binární reprezentaci znaku "Ɣ" (LATIN CAPITAL LETTER GAMMA)
do codepointu (ten má vyjít U+194)
- Znak je v binární soustavě (přečtený ze souboru) jako
11000110 10010100
- Vidíme, že první bajt začíná na
110
, a tedy má znak (podle tabulky z Wikipedie) dva bajty- Ty budou ve formátu
110xxxyy 10yyzzzz
- Ty budou ve formátu
- Nyní z bajtů vyparsujeme potřebné hodnoty
x
je001
, v hex.1
y
je1001
, v hex.9
z
je0100
, v hex.4
- Codepoint tohoto znaku je tedy U+194
- Znak je v binární soustavě (přečtený ze souboru) jako
Řetězec
- Dvě možnosti, jak je ukládat
- Buď jednoduše jako spojitý kus paměti, na jehož začátek máme pointer
- Nevíme ale, kde končí - to vyřešíme koncovým bajtem
- Obvykle se používá nulový bajt
- Takovým řetězcům říkáme céčkové (podle jazyka C)
- Nebo jako nějakou větší strukturu
- Na pozadí bude její částí určitě znovu nějaké pole bytů
- Pamatujeme si délku tohoto pole
- Ta ale může být odlišná od délky samotného textu!
- Buď jednoduše jako spojitý kus paměti, na jehož začátek máme pointer