Čo je kódovanie znakov
Kódovanie je dohoda: «číslo 65 znamená písmeno A». Keď píšete text, program ukladá tieto čísla; keď ho otvorí iná osoba, jej program ich prekladá späť na písmená podľa tej istej dohody. Ak obaja nepoužívajú rovnakú tabuľku, text vyjde zle.
Treba rozlišovať dve myšlienky. Jedna je znaková sada, zoznam toho, ktoré čísla zodpovedajú ktorým symbolom. Druhá je spôsob, ako sa tieto čísla ukladajú do bajtov. V ASCII sa obe zhodujú triviálnym spôsobom; v Unicode nie, a tu vstupuje UTF-8.
ASCII: 128 znakov po 7 bitoch
ASCII (skratka z American Standard Code for Information Interchange) sa štandardizovalo v 60. rokoch 20. storočia. Používa 7 bitov, teda 2 na 7 = 128 kódov od 0 do 127. Z nich je 33 riadiacich znakov (0 až 31 a 127) a 95 tlačiteľných (32 až 126, vrátane medzery).
Neobsahuje písmená s diakritikou, ani ň, ani symbol eura: navrhlo sa pre angličtinu. To vysvetľuje, prečo neskôr boli potrebné iné tabuľky.
| Riadiaci znak | Desiatkovo | Šestnástkovo | Dvojkovo (7 bitov) | Na čo slúži |
|---|---|---|---|---|
| Nulový znak (NUL) | 0 | 00 | 0000000 | V mnohých jazykoch označuje koniec reťazca |
| Vodorovný tabulátor (TAB) | 9 | 09 | 0001001 | Preskočí na ďalší tabulátor |
| Nový riadok (LF) | 10 | 0A | 0001010 | Posunie na nasledujúci riadok |
| Návrat vozíka (CR) | 13 | 0D | 0001101 | Vráti sa na začiatok riadka |
| Escape (ESC) | 27 | 1B | 0011011 | Začína riadiace sekvencie |
| Medzera | 32 | 20 | 0100000 | Prvý tlačiteľný znak |
| Vymazanie (DEL) | 127 | 7F | 1111111 | Vymaže znak |
Vzťahy, ktoré sa oplatí zapamätať
Tabuľka nie je usporiadaná náhodne. S niekoľkými pravidelnosťami viete čítať kódy spamäti.
- Číslice od «0» do «9» zaberajú 48 až 57 (30 až 39 šestnástkovo). Hodnota číslice je jej kód mínus 48: «7» je 55 a 55 − 48 = 7.
- Veľké písmená idú od 65 («A») do 90 («Z») a malé od 97 («a») do 122 («z»).
- Rozdiel medzi veľkým písmenom a jeho malým je vždy 32: «A» = 65 a «a» = 97; «C» = 67 a «c» = 99. Dvojkovo sa mení iba jeden bit: 01000001 pre «A» a 01100001 pre «a».
- Ak chcete zistiť, ktoré miesto v abecede zaujíma veľké písmeno, odčítajte 64: «C» je 67 a 67 − 64 = 3, tretie písmeno.
- Keďže všetky veľké písmená (65 až 90) majú kódy menšie než malé (97 až 122), abecedné usporiadanie «podľa kódu» dá «Zebra» pred «apple». Mnohé programy potrebujú na správne triedenie samostatnú možnosť porovnávania.
Koniec riadka: LF, CR a CRLF
Koniec riadka vyzerá ako jednoduchá vec, ale zapisuje sa rôzne podľa systému. Unix, Linux a macOS používajú jediný znak, LF (10). Windows používa dva po sebe, CR a LF (13 a 10), známe ako CRLF. Staré diaľnopisy potrebovali dva rôzne príkazy: vrátiť vozík na začiatok a posunúť papier o riadok.
Tento rozdiel je príčinou súborov, ktoré sa v základnom editore zobrazujú celé na jednom riadku, alebo s podivným symbolom na konci každého riadka. Ak hľadáte, aký kód ktorý má, napíšte LF alebo CR do vyhľadávača v ASCII tabuľke.
«Rozšírené ASCII» nie je štandard
Keďže bajt má 8 bitov a ASCII používa len 7, zostalo 128 voľných kódov (od 128 do 255) a každý výrobca a región ich vyplnil po svojom. Toto sa označuje ako «rozšírené ASCII», ale neexistuje jediná tabuľka: je ich veľa, nazývajú sa kódové stránky. Dve z najznámejších sú Latin-1 (ISO-8859-1), kde é je kód 233, a Windows-1252, podobná, ale s rozdielmi v kódoch 128 až 159 (je tam napríklad euro).
Problém je, že kód 233 znamená «é» v jednej tabuľke a niečo iné v druhej. Text napísaný jednou tabuľkou a prečítaný druhou zobrazil nezmysly. Unicode vznikol, aby tento neporiadok ukončil.
Unicode a UTF-8
Unicode priraďuje jedinečné číslo, nazývané kódový bod, každému znaku takmer všetkých písiem sveta, k tomu symboly a emoji. Dnes má viac než 150 000 znakov. Zapisuje sa s predponou U+ a šestnástkovo: «A» je U+0041, «ñ» je U+00F1, euro je U+20AC a emoji usmiatej tváre je U+1F600. Prvých 128 kódových bodov je presne tých z ASCII.
UTF-8 je najpoužívanejší spôsob ukladania týchto čísel do bajtov a podľa znaku používa 1 až 4. Tých 128 z ASCII zaberá jediný bajt identický ako vždy, takže ASCII text je zároveň platný UTF-8 text. Zvyšok zaberá viac bajtov.
| Znak | Kódový bod | Bajty v UTF-8 | Bajty (šestnástkovo) |
|---|---|---|---|
| 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 |
Prečo sa namiesto «ñ» objaví «Ã±»
Je to najčastejšia chyba a má presné vysvetlenie. Znak ñ v UTF-8 sú dva bajty: C3 a B1. Ak si program myslí, že text je v Latin-1, číta každý bajt ako znak: C3 je «Ã» a B1 je «±». Výsledok: «Ã±». To isté sa stane s «é», ktoré sa zobrazí ako «Ã©», a so slovom «canción», ktoré sa objaví ako «canción».
Riešenie je takmer vždy povedať programu, aby súbor otvoril ako UTF-8 (v textovom editore alebo v nastavení importu tabuľkového procesora). Keď nastane opak, text v Latin-1 prečítaný ako UTF-8, zvyknú sa objaviť kosoštvorce s otáznikom, pretože tieto osamotené bajty netvoria platné sekvencie UTF-8.
Ako používať ASCII tabuľku a prevodník
Nástroj «ASCII tabuľka» zobrazuje 128 znakov s kódom desiatkovo, šestnástkovo, osmičkovo a dvojkovo a s názvom riadiacich.
- Do vyhľadávania napíšte znak, kód alebo názov riadiaceho znaku (napríklad A, 65, 41 alebo LF) a nájdite jeho riadok.
- Pomocou tlačidiel filtra (Riadiace, Číslice, Veľké písmená, Malé písmená, Znaky) zobrazte len jednu skupinu.
- Na prevod napíšte text do «Text» a vyberte formát (desiatkový, šestnástkový, osmičkový alebo dvojkový): dole sa zobrazia kódy. «Hola» dá 72 111 108 97 desiatkovo a 48 6F 6C 61 šestnástkovo.
- Môžete to urobiť aj opačne: vložte kódy oddelené medzerami alebo čiarkami do «Kódy» a vytvorí sa text. Pri šestnástkovom zápise sa prijímajú aj predpony ako 0x41.
Ak text obsahuje znaky mimo ASCII, napríklad ñ, nástroj to oznámi a zobrazí ich kód Unicode. Na zobrazenie skutočných bajtov v UTF-8 použite «Text do binárneho kódu»: ñ dá 11000011 10110001, dva 8-bitové bajty. Limity: tabuľka zobrazuje iba štandardné ASCII, nie rozšírené, a všetko sa počíta vo vašom prehliadači bez odosielania textu na server.
Často kladené otázky
Koľko znakov má ASCII?
128, s kódmi od 0 do 127 a 7 bitmi každý. Z nich je 33 riadiacich a 95 tlačiteľných, vrátane medzery.
Aký je ASCII kód písmena A a a?
«A» je 65 (41 šestnástkovo, 01000001 dvojkovo) a «a» je 97 (61 šestnástkovo, 01100001 dvojkovo). Vždy sa líšia o 32.
Aký je rozdiel medzi ASCII a Unicode?
ASCII má 128 znakov navrhnutých pre angličtinu. Unicode má viac než 150 000 znakov takmer všetkých jazykov a emoji a jeho prvých 128 je rovnakých ako v ASCII.
Čo je UTF-8?
Je to najpoužívanejší spôsob ukladania textu Unicode do bajtov. Používa 1 až 4 bajty na znak: znaky ASCII zaberajú jeden, ñ dva a emoji štyri.
Prečo môj text zobrazuje «Ã±» alebo «Ã©»?
Pretože text uložený v UTF-8 sa číta ako Latin-1. Otvorte súbor so zadaným kódovaním UTF-8 a opraví sa to.