Co je kódování znaků
Kódování je dohoda: «číslo 65 znamená písmeno A». Když napíšete text, program uloží tato čísla; když ho otevře někdo jiný, jeho program je pomocí téže dohody přeloží zpět na písmena. Pokud oba nepoužívají stejnou tabulku, text se zobrazí špatně.
Je třeba oddělit dvě myšlenky. Jednou je znaková sada, seznam toho, která čísla odpovídají kterým symbolům. Druhou je způsob, jak se tato čísla ukládají do bajtů. V ASCII se obě triviálně shodují; v Unicode ne, a tady přichází ke slovu UTF-8.
ASCII: 128 sedmibitových znaků
ASCII (zkratka American Standard Code for Information Interchange) bylo standardizováno v 60. letech. Používá 7 bitů, tedy 2 na sedmou = 128 kódů, od 0 do 127. Z nich je 33 řídicích znaků (0 až 31 a 127) a 95 tisknutelných (32 až 126, včetně mezery).
Neobsahuje písmena s háčky a čárkami, ani symbol eura: bylo navrženo pro angličtinu. To vysvětluje, proč později byly potřeba další tabulky.
| Řídicí znak | Desítkově | Šestnáctkově | Dvojkově (7 bitů) | K čemu slouží |
|---|---|---|---|---|
| Nulový znak (NUL) | 0 | 00 | 0000000 | V některých jazycích označuje konec řetězce |
| Vodorovný tabulátor (TAB) | 9 | 09 | 0001001 | Skočí na další zarážku tabulátoru |
| Nový řádek (LF) | 10 | 0A | 0001010 | Posune se na další řádek |
| Návrat vozíku (CR) | 13 | 0D | 0001101 | Vrátí se na začátek řádku |
| Escape (ESC) | 27 | 1B | 0011011 | Zahajuje řídicí sekvence |
| Mezera | 32 | 20 | 0100000 | První tisknutelný znak |
| Smazat (DEL) | 127 | 7F | 1111111 | Vymaže znak |
Vztahy, které se vyplatí pamatovat
Tabulka není seřazena náhodně. S několika pravidelnostmi můžete kódy číst zpaměti.
- Číslice od «0» do «9» zabírají 48 až 57 (30 až 39 šestnáctkově). Hodnota číslice je její kód minus 48: «7» je 55 a 55 − 48 = 7.
- Velká písmena jdou od 65 («A») do 90 («Z») a malá od 97 («a») do 122 («z»).
- Rozdíl mezi velkým písmenem a jeho malou variantou je vždy 32: «A» = 65 a «a» = 97; «C» = 67 a «c» = 99. Ve dvojkové soustavě se mění jen jeden bit: 01000001 pro «A» a 01100001 pro «a».
- Chcete-li zjistit, na kolikátém místě abecedy velké písmeno stojí, odečtěte 64: «C» je 67 a 67 − 64 = 3, třetí písmeno.
- Protože všechna velká písmena (65 až 90) mají menší kódy než malá (97 až 122), řazení «podle kódu» dá «Zebra» před «apple». Mnoho programů potřebuje k správnému řazení samostatnou možnost porovnávání.
Konec řádku: LF, CR a CRLF
Konec řádku vypadá jako jednoduchá věc, ale píše se podle systému různě. Unix, Linux a macOS používají jediný znak, LF (10). Windows používá dva po sobě, CR a LF (13 a 10), známé jako CRLF. Staré dálnopisy potřebovaly dva různé příkazy: vrátit vozík na začátek a posunout papír o řádek.
Tento rozdíl je příčinou souborů, které se v základním editoru zobrazí celé na jednom řádku, nebo s podivným symbolem na konci každého řádku. Chcete-li zjistit, jaký kód má který z nich, napište LF nebo CR do vyhledávání v ASCII tabulce.
«Rozšířené ASCII» není standard
Protože bajt má 8 bitů a ASCII využívá jen 7, zbývalo 128 volných kódů (128 až 255) a každý výrobce a region je zaplnil po svém. Říká se tomu «rozšířené ASCII», ale neexistuje jedna jediná tabulka: je jich mnoho, nazývají se kódové stránky. Dvě z nejznámějších jsou Latin-1 (ISO-8859-1), kde é má kód 233, a Windows-1252, podobná, ale s rozdíly v kódech 128 až 159 (tam je například euro). U češtiny se používaly především ISO-8859-2 a Windows-1250.
Problém je, že kód 233 znamená «é» v jedné tabulce a něco jiného v jiné. Text zapsaný jednou tabulkou a čtený jinou ukazoval změť znaků. Unicode vznikl, aby tomuto nepořádku udělal přítrž.
Unicode a UTF-8
Unicode přiřazuje jedinečné číslo, zvané kódový bod, každému znaku téměř všech světových písem, plus symbolům a emoji. Dnes má více než 150 000 znaků. Zapisuje se s předponou U+ a šestnáctkově: «A» je U+0041, «ñ» je U+00F1, euro je U+20AC a emoji usměvavého obličeje je U+1F600. Prvních 128 kódových bodů je přesně těch z ASCII.
UTF-8 je nejpoužívanější způsob, jak tato čísla ukládat do bajtů, a používá 1 až 4 podle znaku. Těch 128 znaků ASCII zabírá jediný bajt shodný s tím dřívějším, takže ASCII text je zároveň platný text UTF-8. Zbytek zabírá víc bajtů.
| Znak | Kódový bod | Bajty v UTF-8 | Bajty (šestnáctkově) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
Proč se místo «ñ» objeví «Ã±»
Je to nejčastější chyba a má přesné vysvětlení. Znak ñ jsou v UTF-8 dva bajty: C3 a B1. Pokud si program myslí, že je text v Latin-1, přečte každý bajt jako jeden znak: C3 je «Ã» a B1 je «±». Výsledek: «Ã±». Totéž se stane s «é», které vypadá jako «Ã©», a se slovem «canción», které se zobrazí jako «canción». U češtiny se podobně místo «ě» objeví «Ä›».
Řešení je téměř vždy říct programu, aby soubor otevřel jako UTF-8 (v textovém editoru nebo v nastavení importu tabulkového procesoru). Když nastane opak, text v Latin-1 čtený jako UTF-8, objeví se obvykle kosočtverce s otazníkem, protože tyto osamocené bajty netvoří platné sekvence UTF-8.
Jak používat ASCII tabulku a převodník
Nástroj «ASCII tabulka» zobrazuje 128 znaků s jejich kódem v desítkové, šestnáctkové, osmičkové a dvojkové soustavě a názvem řídicích znaků.
- Napište do vyhledávání znak, kód nebo název řídicího znaku (například A, 65, 41 nebo LF) a najdete jeho řádek.
- Pomocí filtrovacích tlačítek (Řídicí, Číslice, Velká písmena, Malá písmena, Znaky) zobrazíte jen jednu skupinu.
- Pro převod napište text do pole «Text» a vyberte formát (desítkový, šestnáctkový, osmičkový nebo binární): níže se objeví kódy. «Hola» dá 72 111 108 97 desítkově a 48 6F 6C 61 šestnáctkově.
- Můžete to udělat i obráceně: vložte kódy oddělené mezerami nebo čárkami do pole «Kódy» a vytvoří se text. V šestnáctkové soustavě se přijímají předpony jako 0x41.
Pokud text obsahuje znaky, které nejsou ASCII, například ñ, nástroj na to upozorní a zobrazí jeho kód Unicode. Skutečné bajty v UTF-8 uvidíte v nástroji «Text na binární kód»: ñ dá 11000011 10110001, dva bajty o 8 bitech. Omezení: tabulka zobrazuje jen standardní ASCII, ne rozšířené, a vše se počítá ve vašem prohlížeči, bez odesílání textu na jakýkoli server.
Často kladené otázky
Kolik znaků má ASCII?
128, s kódy od 0 do 127 a 7 bity každý. Z nich je 33 řídicích a 95 tisknutelných, včetně mezery.
Jaký je ASCII kód písmene A a písmene a?
«A» je 65 (41 šestnáctkově, 01000001 dvojkově) a «a» je 97 (61 šestnáctkově, 01100001 dvojkově). Vždy se liší o 32.
Jaký je rozdíl mezi ASCII a Unicode?
ASCII má 128 znaků určených pro angličtinu. Unicode jich má více než 150 000, z téměř všech jazyků a emoji, a jeho prvních 128 je stejných jako v ASCII.
Co je UTF-8?
Je to nejpoužívanější způsob ukládání textu Unicode do bajtů. Používá 1 až 4 bajty na znak: znaky ASCII zabírají jeden, ñ dva a emoji čtyři.
Proč se v mém textu zobrazuje «Ã±» nebo «Ã©»?
Protože se text uložený v UTF-8 čte jako Latin-1. Otevřete soubor s uvedením kódování UTF-8 a problém zmizí.