Fő tartalom
Tantárgy/kurzus: A számítógép és az Internet > 1. témakör
5. lecke: Szöveg tárolása binárisanSzöveg tárolása binárisan
A számítógépek nem csak számokat tárolnak binárisan. De hogyan tudnak a bináris számok nem-számokat, például betűket és szimbólumokat ábrázolni?
Ehhez mindössze egy kis emberi együttműködésre van szükség. Meg kell állapodnunk a kódolásokban, vagyis a karakterek és a bináris számok közötti leképezésekben.
Egyszerű kódolás
Mi lenne, ha például az alábbi szimbólumokat szeretnénk binárisan tárolni?
☮️❤️😀
Nézzünk egy egyszerű kódolást:
Bináris | Szimbólum |
---|---|
☮️ | |
❤️ | |
😀 |
Nevezzük ezt HPE-kódolásnak (a Heart – szív, Peace – béke, E – emoji szimbólumok alapján). Segít a programozóknak, ha a kódolásoknak nevet adunk, hogy tudják, ha ugyanazt a kódolást használják.
Ha egy számítógépes programnak a ❤️ jelet kell tárolnia a számítógép memóriájában, akkor tárolhatja helyette az -t. Amikor a programnak az -t kell megjelenítenie a felhasználónak, emlékszik a HPE-kódolásra, és helyette a ❤️ jelet jeleníti meg.
A számítógépes programoknak és fájloknak gyakran több karaktert kell tárolniuk. Ezt az egyes karakterek kódolásának összefűzésével tudják megtenni.
Egy program írhatna például egy „msg.hpe” nevű fájlt ezekkel az adatokkal:
Egy másik számítógépen lévő program, amely érti a HPE kódolást, ezután meg tudja nyitni az „msg.hpe” állományt, és meg tudja jeleníteni a szimbólumok sorozatát.
A HPE kódolás csak 2 bites, így ez korlátozza, hogy hány szimbólumot tud ábrázolni.
Több bitnyi információ használatával viszont elegendő betűt képes ábrázolni ahhoz, hogy a számítógép üzeneteket, dokumentumokat és weboldalakat tudjon tárolni.
ASCII kódolás
Az ASCII volt az egyik legelső szabványosított kódolás. Az 1960-as években találták fel, amikor a távolsági kommunikáció elsődleges formája a távírás volt, azonban még a mai modern számítástechnikai rendszerekben is használják.
A távírógép használói üzeneteket gépeltek a képen láthatóhoz hasonló távírógépeken:
A távíró ezután az ASCII szabvány alapján binárisan kódolta az egyes beírt karaktereket, majd a bináris adatokat vagy tárolta, vagy továbbította.
Az alábbi képen egy 1972-es nyomtató kézikönyvének egyik oldala látható, rajta 128 ASCII kóddal:
Minden ASCII karaktert binárisan kódoltak, 7 bitet használva. A fenti táblázatban az oszlop címe az első 3 bitet, a sor címe pedig az utolsó 4 bitet jelöli. A legelső karakter a „NUL”, -ként kódolva.
Az első 32 kód „vezérlőkarakterekből” áll, tehát olyan karakterekből, amelyek a betű nyomtatásán kívül más hatást is kifejtenek. A „BEL” (binárisan kódolva: ) csengést vagy egyéb hangjelzést okozott. Az „ENQ” (kódolva ) egy megkeresést jelöl, mely a fogadó állomást arra kéri, hogy azonosítsa magát.
A vezérlőkaraktereket eredetileg távírókhoz és távírógépekhez tervezték, de közülük sokat újrahasznosítottak a modern számítógépek és az internet számára, főleg a „CR”-t és az „LF”-et. A „CR” ( ) a távírógépeken a „kocsi-visszatérést” (carriage return) jelentette, ez a nyomtatófejet a sor elejére vitte. Az „LF” ( ) „sortovábbítást” (line feed) jelentett, ez a nyomtatófejet egy sorral lejjebb vitte. A modern internetes protokollok, például a HTTP, az FTP és az SMTP egy „CR” + „LF” kombinációt alkalmazva jelölik a sorok végét.
A fennmaradó 96 ASCII karakter már sokkal ismerősebb.
Íme az első 8 nagybetű:
Bináris | Karakter |
---|---|
A | |
B | |
C | |
D | |
E | |
F | |
G | |
H |
Az ASCII-szabvány alapján egy négybetűs üzenetet binárisba tudunk kódolni:
Az ASCII kódolással azonban számos probléma van.
Az első nagy probléma az, hogy az ASCII csak az angol ábécé betűit, valamint korlátozott számú jelet tartalmaz.
Az olyan nyelvek amelyek 128-nál kevesebb karaktert használnak, megalkothatnák a saját ASCII verziójukat csak a saját nyelvükön írt szövegek kódolására. De mi a helyzet egy olyan szövegfájllal, amelyben több nyelv karakterei fordulnak elő? Az ASCII nem lenne képes egy olyan karakterláncot kódolni, mint például a „Helló José, kérsz Glühweint? Az ára 10 €”.
És mi a helyzet az olyan nyelvekkel, amelyekben több ezer logogram van? Az ASCII nem lenne képes elég logogramot kódolni egy olyan kínai mondathoz, mint például a „你好,想要一盘饺子吗?十块钱。”.
A másik probléma az ASCII-kódolással az, hogy 7 bitet használ minden egyes karakter ábrázolására, míg a számítógépek általában bájtokban – 8 bitből álló egységekben – tárolják az információt. A programozók márpedig nem szeretik pazarolni a memóriát.
Amikor a legelső számítógépek elkezdték használni az ASCII-t a karakterek kódolására, különböző számítógépek különböző módokat találtak ki arra, hogy mire használják fel az utolsó bitet. Például a HP számítógépek a nyolcadik bitet európai országokban használt karakterek (pl. „£” és „Ü”) ábrázolására használták, a TRS-80 számítógépek színes grafikákhoz, az Atari számítógépek pedig az első 128 karakter invertált, fehér-fekete változataihoz.
Az eredmény? Könnyen előfordulhatott, hogy az egyik alkalmazásban létrehozott „ASCII” fájl egy másik „ASCII”-kompatibilis alkalmazásban megnyitva teljesen értelmetlennek tűnt.
Új kódolásra volt szükség, méghozzá egy olyan 8-bites bájton alapuló kódolásra, amely a világ összes nyelvére alkalmazható.
Az Unicode
Először is hány karakterre van egyáltalán szükség a világ összes nyelvének ábrázolásához? Melyek azok a karakterek, melyek alapvetően minden nyelven azonosak, még ha különböző is a hangzásuk?
1987-ben számítógépes mérnökök egy csoportja megpróbált választ adni ezekre a kérdésekre. Végül létrehozták az Unicode-ot, egy univerzális karakterkészletet, amely minden karakterhez egy „kódpontot” (hexadecimális számot) és egy nevet rendel.
Az „ą” karaktert például az „U+0105”-höz rendelték, és „latin kisbetűs A jobb farokkal” néven jelölik. Az „ą”-hoz hasonló karakter 13 nyelvben fordul elő, például a lengyelben és a litvánban. Így az Unicode szerint a lengyel „robią” szóban lévő „ą” és a litván „aslą” szóban lévő „ą” ugyanaz a karakter. Az Unicode azáltal, hogy a nyelvek közötti karaktereket egységesíti, helyet takarít meg.
De még így is jó sok karaktert kellett kódolni. Az Unicode karakterkészlet 1991-ben 7129 nevesített karakterrel indult, és 2019-re 137 929 nevesített karakterre nőtt. Ezeknek a karaktereknek a többsége kínai, japán és koreai logogramokat ír le, mint például az „U+6728”, amely a „木” jelre utal. Több mint 1200 emoji szimbólum is szerepel benne („U+1F389” = „🎉”).
Az Unicode karakterkészlet, nem kódolás. Szerencsére mérnökök egy másik csoportja talált megoldást a Unicode hatékony bináris kódolására.
UTF-8
1992-ben informatikusok feltalálták az UTF-8 kódolást, amely kompatibilis az ASCII kódolással, de megoldja annak problémáit is.
Az UTF-8 az Unicode-szabvány minden karakterét 1, 2, 3 vagy 4 bájt segítségével írja le.
Amikor egy számítógépes program UTF-8 szövegfájlt olvas, a bájt elején található
1
-es bitek száma alapján tudja, hogy hány bájt jelenti a következő karaktert.Bájtok száma | 1. bájt | 2. bájt | 3. bájt | 4. bájt |
---|---|---|---|---|
1 | 0xxxxxxx | |||
2 | 110xxxxx | 10xxxxxx | ||
3 | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
Ha az előtagban nincsenek
1
bitek – ha az első bit 0
–, akkor ez azt jelenti, hogy a karaktert egyetlen bájt jelöli. A bájt fennmaradó 7 bitjét az eredeti 128 ASCII karakter ábrázolására használják. Ez azt jelenti, hogy egy 8-bites ASCII karakterekből álló sorozat is érvényes UTF-8 sorozat.Az
110
-val kezdődő két bájtot a latin betűs nyelvek (pl. spanyol, német) és más nyelvek, például a görög, héber és arab karakterek kódolására használják. Az 1110
-val kezdődő három bájt az ázsiai nyelvek (pl. kínai, japán, koreai) legtöbb karakterét kódolja. Az 11110
-val kezdődő négy bájt minden mást kódol, a ritkán használt történelmi írásjelektől az egyre gyakrabban használt emoji szimbólumokig.A legtöbb modern programozási nyelvben van beépített UTF-8 támogatás, így a legtöbb programozónak soha nem kell tudnia, hogy pontosan hogyan kell a karaktereket binárisra konvertálni.
✏️ Próbáld ki alább, hogyan működik a JavaScript a karakterláncok UTF-8-as kódolásához! Játssz több nyelvvel és jellel!
Az UTF-8 kódolási szabvány jelenleg a HTML-fájlok legelterjedtebb kódolása a weben: 2019 decemberében a weboldalak 94,5%-át tette ki.
🔎 Ha most jobb egérgombbal rákattintasz erre a weboldalra, és kiválasztod az „Oldal forrásának megtekintése” („View page source”) menüpontot, rákereshetsz az „utf-8” karakterláncra, és láthatod, hogy ez a weboldal is UTF-8 kódolású.
Általában az a jó kódolás, amely a lehető legkevesebb bittel képes a maximális információmennyiséget megjeleníteni. Az UTF-8 remek példa erre, mivel az angol betűket mindössze 1 bájttal tudja kódolni, de elég rugalmas ahhoz, hogy további bájtokkal betűk ezreit kódolja.
Az UTF-8 azonban csak egy a lehetséges kódolások közül. Az UTF-16 és UTF-32 olyan alternatív kódolások, amelyek szintén képesek az összes Unicode karaktert megjeleníteni. Vannak nyelvspecifikus kódolások is, mint például a japán Shift-JIS. A számítógépes programoknak lehetőségük van az igényeiknek és korlátaiknak leginkább megfelelő kódolást használni.
🙋🏽🙋🏻♀️🙋🏿♂️Kérdésed van a témával kapcsolatban? Szívesen válaszolunk, csak kérdezz alább, a „Kérdések” részben!
Szeretnél részt venni a beszélgetésben?
Még nincs hozzászólás.