Mi az a karakterkódolás
A kódolás egy megállapodás: «a 65-ös szám az A betűt jelenti». Amikor szöveget írsz, a program ezeket a számokat tárolja; amikor valaki más megnyitja, az ő programja ugyanezzel a megállapodással fordítja vissza betűkre. Ha a kettő nem ugyanazt a táblázatot használja, a szöveg hibásan jelenik meg.
Két dolgot érdemes szétválasztani. Az egyik a karakterkészlet, vagyis hogy mely számok mely jeleknek felelnek meg. A másik az, hogyan tárolódnak ezek a számok bájtokban. Az ASCII-nál a kettő triviálisan egybeesik; a Unicode-nál nem, és itt jön be az UTF-8.
ASCII: 128 karakter, 7 biten
Az ASCII (az American Standard Code for Information Interchange rövidítése) az 1960-as években vált szabvánnyá. 7 bitet használ, vagyis 2 a 7-ediken = 128 kódot, 0-tól 127-ig. Ebből 33 vezérlőkarakter (0-tól 31-ig és a 127) és 95 nyomtatható (32-től 126-ig, a szóközzel együtt).
Nem tartalmaz ékezetes betűket, sem ő-t, sem ű-t, sem az euró jelét: angolra tervezték. Ez magyarázza, miért kellett később más táblázatokat készíteni.
| Vezérlőkarakter | Decimális | Hexadecimális | Bináris (7 bit) | Mire való |
|---|---|---|---|---|
| Null (NUL) | 0 | 00 | 0000000 | Több nyelvben a karakterlánc végét jelöli |
| Vízszintes tabulátor (TAB) | 9 | 09 | 0001001 | A következő tabulátorhelyre ugrik |
| Soremelés (LF) | 10 | 0A | 0001010 | A következő sorra lép |
| Kocsivissza (CR) | 13 | 0D | 0001101 | Visszatér a sor elejére |
| Escape (ESC) | 27 | 1B | 0011011 | Vezérlősorozatokat indít |
| Szóköz | 32 | 20 | 0100000 | Az első nyomtatható karakter |
| Törlés (DEL) | 127 | 7F | 1111111 | Törli a karaktert |
Összefüggések, amelyeket érdemes megjegyezni
A táblázat nem véletlenszerűen van rendezve. Néhány szabályszerűséggel fejből is olvashatsz kódokat.
- A «0»-tól «9»-ig terjedő számjegyek 48-tól 57-ig vannak (hexadecimálisan 30-tól 39-ig). Egy számjegy értéke a kódja mínusz 48: a «7» 55, és 55 − 48 = 7.
- A nagybetűk 65-től («A») 90-ig («Z»), a kisbetűk 97-től («a») 122-ig («z») tartanak.
- Egy nagybetű és kisbetűje közötti különbség mindig 32: «A» = 65 és «a» = 97; «C» = 67 és «c» = 99. Binárisan csak egy bit változik: 01000001 az «A»-nál és 01100001 az «a»-nál.
- Hogy megtudd, hányadik helyen áll egy nagybetű az ábécében, vonj ki 64-et: a «C» 67, és 67 − 64 = 3, a harmadik betű.
- Mivel az összes nagybetű (65–90) kódja kisebb a kisbetűkénél (97–122), a «kód szerinti» ábécérend a «Zebra» szót az «alma» elé teszi. Sok programnak külön összehasonlítási beállítás kell a helyes rendezéshez.
Sorvég: LF, CR és CRLF
A sortörés egyszerűnek tűnik, de rendszertől függően másként írják. A Unix, a Linux és a macOS egyetlen karaktert használ, az LF-et (10). A Windows két egymás utánit, a CR-t és az LF-et (13 és 10), amelyeket CRLF-nek hívnak. A régi telexgépeknek két külön parancs kellett: a kocsit visszavinni a sor elejére, és a papírt egy sorral előretolni.
Ez a különbség az oka annak, hogy egyes fájlok egy alap szerkesztőben egyetlen sorban látszanak, vagy minden sor végén furcsa jel van. Ha tudni szeretnéd, melyiknek mi a kódja, írd be az LF-et vagy a CR-t az ASCII táblázat keresőjébe.
A «kiterjesztett ASCII» nem szabvány
Mivel egy bájt 8 bit, az ASCII pedig csak 7-et használ, 128 szabad kód maradt (128-tól 255-ig), és minden gyártó és régió a maga módján töltötte fel őket. Ezt hívják «kiterjesztett ASCII»-nak, de nincs egyetlen táblázat: sok van, ezeket kódlapoknak nevezik. Két ismert közülük a Latin-1 (ISO-8859-1), ahol az é a 233-as kód, és a Windows-1252, amely hasonló, de eltér a 128–159 kódoknál (itt van például az euró). A magyar szövegekhez a Latin-2 (ISO-8859-2) kellett, mert a Latin-1-ben nincs ő és ű: ott a 245-ös kód az õ (nem ő), a 251-es pedig az û.
A gond az, hogy a 233-as kód az egyik táblázatban «é», a másikban valami más. Az egyik táblázattal írt és a másikkal olvasott szöveg zagyvaságot mutatott. A Unicode azért született, hogy véget vessen ennek a zűrzavarnak.
Unicode és UTF-8
A Unicode a világ szinte minden írásrendszerének minden karakteréhez, valamint a szimbólumokhoz és az emodzsikhoz egyedi számot rendel, amelyet kódpontnak hívnak. Ma több mint 150 000 karaktere van. U+ előtaggal és hexadecimálisan írják: az «A» U+0041, az «á» U+00E1, az «ő» U+0151, az euró U+20AC, a mosolygó arc emodzsi pedig U+1F600. Az első 128 kódpont pontosan az ASCII-é.
Az UTF-8 ezeknek a számoknak a legelterjedtebb bájtokban tárolási módja, és karaktertől függően 1–4 bájtot használ. Az ASCII 128 karaktere egyetlen, a régivel azonos bájtot foglal el, így egy ASCII-szöveg egyben érvényes UTF-8 szöveg is. A többi több bájtot foglal.
| Karakter | Kódpont | Bájtok UTF-8-ban | Bájtok (hexadecimális) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ő | U+0151 | 2 | C5 91 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
Miért jelenik meg «Ã¡» az «á» helyett
Ez a leggyakoribb hiba, és pontos magyarázata van. Az á UTF-8-ban két bájt: C3 és A1. Ha egy program azt hiszi, hogy a szöveg Latin-1 kódolású, minden bájtot külön karakterként olvas: a C3 «Ã», az A1 pedig «¡». Az eredmény: «Ã¡». Ugyanez történik az «é»-vel, amely «Ã©»-nek látszik, és a «köszönöm»-mel, amely «köszönöm»-ként jelenik meg.
A megoldás szinte mindig az, hogy megmondod a programnak, nyissa meg a fájlt UTF-8-ként (egy szövegszerkesztőben vagy egy táblázatkezelő importálási beállításában). Amikor fordítva történik, vagyis Latin-1 szöveget olvasnak UTF-8-ként, gyakran kérdőjeles rombuszok jelennek meg, mert ezek az egyedi bájtok nem alkotnak érvényes UTF-8 sorozatokat.
Hogyan használd az ASCII táblázatot és az átalakítót
Az «ASCII táblázat» eszköz mind a 128 karaktert megmutatja decimális, hexadecimális, oktális és bináris kódjával, a vezérlőkarakterek nevével együtt.
- Írj a keresőbe egy karaktert, egy kódot vagy egy vezérlőkarakter nevét (például A, 65, 41 vagy LF), hogy megtaláld a sorát.
- A szűrőgombokkal (Vezérlő, Számjegyek, Nagybetűk, Kisbetűk, Jelek) csak egy csoportot láthatsz.
- Átalakításhoz írj egy szöveget a «Szöveg» mezőbe, és válaszd ki a formátumot (decimális, hexadecimális, oktális vagy bináris): lent megjelennek a kódok. A «Szia» decimálisan 83 122 105 97, hexadecimálisan pedig 53 7A 69 61.
- Fordítva is megteheted: illessz be szóközzel vagy vesszővel elválasztott kódokat a «Kódok» mezőbe, és összeáll a szöveg. Hexadecimálisan elfogadott az előtag is, például 0x41.
Ha a szövegben nem ASCII karakterek vannak, például az á, az eszköz jelzi, és megmutatja a Unicode-kódját. A valódi UTF-8 bájtok megtekintéséhez használd a «Szöveg binárisra» eszközt: az á 11000011 10100001, két 8 bites bájt. A korlátok: a táblázat csak a szabványos ASCII-t mutatja, nem a kiterjesztettet, és minden a böngésződben számolódik, a szöveget nem küldjük el semmilyen szervernek.
Gyakori kérdések
Hány karaktere van az ASCII-nak?
128, 0-tól 127-ig terjedő kódokkal, egyenként 7 biten. Ebből 33 vezérlő és 95 nyomtatható, a szóközt is beleértve.
Mi az A és az a betű ASCII-kódja?
Az «A» 65 (hexadecimálisan 41, binárisan 01000001), az «a» pedig 97 (hexadecimálisan 61, binárisan 01100001). Mindig 32-vel különböznek.
Mi a különbség az ASCII és a Unicode között?
Az ASCII-nak 128 karaktere van, angolra tervezve. A Unicode-nak több mint 150 000, szinte minden nyelvből és emodzsikból, és az első 128 megegyezik az ASCII-éval.
Mi az az UTF-8?
A Unicode-szöveg bájtokban tárolásának legelterjedtebb módja. Karakterenként 1–4 bájtot használ: az ASCII-karakterek egyet, egy á kettőt, egy emodzsi négyet foglal.
Miért látszik a szövegem «Ã¡»-nak vagy «Ã©»-nak?
Mert az UTF-8-ban mentett szöveget Latin-1-ként olvassák. Nyisd meg a fájlt az UTF-8 kódolás megadásával, és megoldódik.