A szövegkódolás megtudhatja, hogyan d; Unicode - Buzut

Most, hogy ismerjük az Unicode és annak történetének szükségességét, vessünk egy pillantást a technikai részletekre. Azt mondtuk, hogy a konzorcium több kódolást egységesít, tehát mik ezek és hogyan működnek ?

Mivel ezek a kódolások nagyon népszerűek, a nevük ismerős számodra, főleg, hogy az előző fejezetekben már említettük őket. Ezek UTF-n kódolások. A kódolások közötti különbség a karakter ábrázolásához szükséges bájtok minimális hossza.

Azt mondtuk, hogy eredetileg az Unicode volt minden két bájtban. Mivel a legtöbb latin nyelv nagyon kevés nem ASCII jelet használ, ez sokak számára elfogadhatatlan helypazarlás.

Másrészt az olyan jeleket használó nyelvek esetében, amelyek nem részei az ASCII-nek, ezek a kódolások nagyon hasznosak. Tehát mindenkinek megfelelő megoldást kellett találnunk. Tehát az Unicode-ban a kódpontok és a kódolás két nagyon különböző dolog.

Az Unicode tábla

Az Unicode mindenekelőtt egy óriási tábla, amely egyedi karaktereket rendel minden karakterhez, annak kódpontjához vagy kódpont. Az Unicode táblázat lehetővé teszi 1 114 110 (2 16 x 17) kódpont hozzárendelését. Ezeknek a kódpontoknak csupán 25% -át adják ma.

Ez a táblázat 17 síkra (0-tól 16-ig) oszlik, egyenként két bájtból, vagy síkonként 65 536 kódpontból (65 536 x 17 = 1 114 112). Ezek a tervek lehetővé teszik a karaktercsoportok egyszerű kijelölését. Az előtér, hívott Alapvető többnyelvű repülőgép (BMP) vagy Alapvető Többnyelvű Terv csoportosítja a 65 ezer leggyakoribb karaktert. Az 1–16. Terveket további terveknek nevezzük.

Emellett az "Unicode kódolásról" beszélni valójában nincs értelme. Például az Unicode-ban a „hello” fordítás:

Ezek azok az Unicode kódpontok, amelyek megfelelnek a szó különböző betűinek. Amint láthatja, a kódpontok hexadecimálisan vannak kifejezve. Jóllehet általában így fejezik ki őket, tizedes megfelelőjükön keresztül is ábrázolhatók.

A HTML is lehetővé teszi mindkét jelölést.

Ezt tesztelheti a HTML kódolóval. A különféle jelek és a hozzájuk tartozó kódpontok mind fel vannak sorolva az Unicode táblázat webhelyén.

Ezek a kódpontok, függetlenül attól, hogy hexa, decimális vagy bináris formában vannak-e kifejezve, nem elegendőek egy jel kódolásához bináris reprezentációjában.

Kódolások

Addig csak egy módon lehet egy jelet és annak számát egyeztetni az Unicode táblában. Nem árulja el, hogyan tároljuk ezeket az elemeket a memóriában. Itt jönnek a kódolások.

hogyan
Ábra a különböző kódolások karaktereinek memóriaértékeiről

Fix méretű kódolások

Ezeknek a kódolásoknak az az előnye, hogy egyszerű az elemzés és a keresés, valamint a csonkolás, mert bármi is legyen a karakter, annak mérete előre ismert. A bináris és a kódpont közötti leképezés egyszerű. Ez azonban a felhasznált hely (RAM, lemez, sávszélesség stb.) Rovására történik.

Az Unicode első napjaiban, amint láttuk, mindent két bájtban tároltunk. Ez a kódolás, bár elavult, mégis létezik, UCS-2-nek hívják, és rögzített hosszúságú. Nem teszi lehetővé az összes Unicode karakter képviseletét, csak az első 65k, amelyek a leggyakoribbak (emojik azonban nincsenek).

A "hello" tehát a következőképpen tárolható a memóriában (ábrázolás hexa formában).

De mint említettük, egy gépen kis endian, a bájtok megfordulnak.

A példa a hely felesleges használatát szemlélteti, mivel minden két bájtban van tárolva, ha csak ASCII karaktereket használunk - sőt néhány latin betűnél, például ékezetes betűknél, egy bájt pazarolódik el karakterenként.

Most, ha az "€" jel ábrázolását nézzük, a két bájt helyesen van használva.

Másrészt az összes karakter, amely kívül esik a BMP-n, vagyis a 65536 leggyakoribb karakter, nem ábrázolható az UCS-2-ben. Ezért ez a kódolás manapság nem része az Unicode szabványnak.

UTF-32

Ez a kódolás az Unicode szabvány leghosszabb rögzített méretű kódolása, és az is az egyetlen rögzített méretű, amely nem amortizált. Az összes Unicode-karakter 32 bites vagy négy bájtos ábrázolására szolgál. Vesszük az előző példánkat, és az UTF-32BE-be kódoljuk.

Itt az elveszett hely csak elgondolkodtató. Még az emojik sem foglalnak annyi helyet, íme egy pizza 🍕 az UTF-32BE-ben.

Ennek a kódolásnak az az előnye, hogy az összes karakter azonos méretű legyen. Erre a célra szinte soha nem használják szöveg tárolására, inkább belső API-kban szolgál. Például a Python 3 a szöveges változók ábrázolására használja.

Változtatható méretű kódolások

Manapság, két változó méretű kódolás szerepel az Unicode szabványban, UTF-8 és UTF-16. Maximálisuk négy bájt, de a jel legkisebb mérete egy, illetve két bájt.

Vitathatatlanul ez a legelterjedtebb kódolás manapság. Információk tárolására és továbbítására egyaránt. Minimális mérete nyolc bit, egyes jelek esetén akár négy bájt is lehet.

Az UTF-8 megkülönbözteti azt is, hogy teljesen kompatibilis az ASCII-vel. Bármely érvényes ASCII karakter érvényes UTF-8 karakter. Továbbá, mivel egybájtos szavakból áll, nem endian-érzékeny.

Mivel ez egy változó méretű kódolás, egyes jelek több szóból állnak. Annak érdekében, hogy azonosítani lehessen a karaktert alkotó szavak számát, az UTF-8 ezt az információt az első bájtba helyezi.

  • minden olyan kódpont, amelynek értéke kevesebb, mint 128, egy bájtra van kódolva, a legjelentősebb bit nulla (mint az ASCII esetében),
  • a többi kódpont több bájt fölé van kódolva. Az első bájt legjelentősebb bitje 1, annyi 1-el, ahány szó van. Tehát van minimum kettő és legfeljebb négy 1, majd 0 következik, míg a fennmaradó biteket az információk kódolására használjuk. A következő szavaknak 10-vel kell kezdődniük .
Szavak száma bináris ábrázolás
10xxxxxxx
2110xxxxx 10xxxxxx
31110xxxx 10xxxxxx 10xxxxxx
411110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Lássuk ezt néhány konkrét példával. Az „e” betű az ASCII-hez hasonlóan van kódolva. Vagy 65hex, vagy 101dec, ez 01100101bin értéket ad. Eddig nagyon egyszerű.

Vegyük például az emoji 😎 példát. Ha megnézzük az Unicode táblázatot, rájövünk, hogy a kódja U + 1F60E vagy 128526dec. Ha azonban a kódolási részleteket nézzük, akkor a hexa és a tizedes ábrázolás sem felel meg.

Értékünk visszaszerzéséhez meg kell értenünk a fent ismertetett kódolást. Lássuk ezt részletesen.

UTF-16

Az UTF-16 hossza változó, 16 bites szavakkal. Így az UTF-16-ban a jel két vagy négy bájtos. Az UTF-8-tól eltérően az UTF-16 nem kompatibilis az ASCII-vel - és természetesen az UTF-8-tal sem.