Codificarea textului afla cum d; Unicode - Buzut

Acum, că știm nevoia din spatele Unicode și istoria sa, să aruncăm o privire asupra detaliilor tehnice. Am spus că consorțiul standardizează mai multe codificări, deci ce sunt și cum funcționează ?

Deoarece aceste codificări sunt foarte populare, numele lor vă sunt familiare, mai ales că le-am menționat deja în capitolele anterioare. Acestea sunt codificări UTF-n. Diferența dintre aceste codificări este lungimea minimă de octeți necesară pentru a reprezenta un caracter.

Am spus că inițial Unicode era totul până la doi octeți. Deoarece majoritatea limbilor latine folosesc foarte puține semne non-ASCII, aceasta este o risipă inacceptabilă de spațiu pentru mulți.

Pe de altă parte, pentru limbile care utilizează semne care nu fac parte din ASCII, aceste codificări sunt foarte utile. Așa că a trebuit să găsim o soluție care să se potrivească tuturor. Deci, în Unicode, punctele de cod și codificarea sunt două lucruri foarte diferite.

Tabelul Unicode

Unicode este mai presus de toate un tabel gigant care atribuie un număr unic fiecărui caracter, punctul său de cod sau punct de cod. Tabelul Unicode vă permite să atribuiți 1.114.112 (2 16 x 17) puncte de cod. Doar 25% din aceste puncte de cod sunt acordate astăzi.

Acest tabel este împărțit în 17 planuri (de la 0 la 16) de câte doi octeți, sau 65.536 puncte de cod pe plan (65.536 x 17 = 1.114.112). Aceste planuri fac posibilă desemnarea cu ușurință a grupurilor de personaje. Primul plan, numit Plan de bază multilingv (BMP), sau Planul multilingv de bază, grupează cele mai comune 65k caractere. Planurile 1-16 se numesc planuri suplimentare.

De asemenea, a vorbi despre „codificare Unicode” nu prea are sens. De exemplu, în Unicode, „salut” se traduce prin:

Acestea sunt punctele de cod Unicode care corespund diferitelor litere ale cuvântului. După cum puteți vedea, punctele de cod sunt exprimate în hexazecimal. Deși sunt de obicei exprimate astfel, ele pot fi reprezentate și prin echivalentul lor zecimal.

HTML permite ambele notații.

Puteți testa acest lucru cu codificatorul HTML. Diferitele semne și puncte de cod aferente sunt toate listate pe site-ul Unicode Table.

Aceste puncte de cod, fie exprimate în hexa, zecimal sau binar, nu sunt suficiente pentru a codifica un semn în reprezentarea sa binară.

Codificări

Până atunci, avem doar o modalitate de a potrivi un semn și numărul acestuia în tabelul Unicode. Nu ne spune cum să stocăm aceste articole în memorie. Aici intră codările.

codificarea
Diagrama care prezintă valorile de memorie ale caracterelor din diferite codificări

Codificări de dimensiuni fixe

Aceste codificări au avantajul ușurinței de analiză și căutare, precum și a trunchierii, deoarece oricare ar fi caracterul, dimensiunea sa este cunoscută din timp. Cartarea binară a punctelor de cod este simplificată. Cu toate acestea, acest lucru se face în detrimentul spațiului utilizat (RAM, disc, lățime de bandă etc.).

În primele zile ale Unicode, așa cum am văzut, totul era stocat în doi octeți. Această codificare, deși este depreciată, există încă, se numește UCS-2 și are o lungime fixă. Nu permite să reprezinte toate caracterele Unicode, ci doar primele 65k, care sunt cele mai frecvente (nu există emoji).

Prin urmare, „salut” poate fi stocat în memorie după cum urmează (reprezentare în hexa).

Dar, după cum am menționat, pe o mașină mic-endian, octeții vor fi inversați.

Exemplul ilustrează utilizarea inutilă a spațiului, deoarece totul este stocat în doi octeți, dacă sunt folosite doar caractere ASCII - și chiar și pentru unele caractere latine, cum ar fi literele accentuate, un byte este irosit pentru fiecare caracter.

Acum, dacă ne uităm la reprezentarea semnului „€”, cei doi octeți sunt utilizați corect.

Pe de altă parte, toate caracterele care se află în afara BMP, adică cele mai comune 65536 caractere, nu sunt reprezentabile în UCS-2. Acesta este motivul pentru care această codificare nu face parte astăzi din standardul Unicode.

UTF-32

Această codificare este cea mai lungă codificare de dimensiune fixă ​​a standardului Unicode și este, de asemenea singurul de mărime fixă ​​care nu este depreciat. Este folosit pentru a reprezenta toate caracterele Unicode pe 32 de biți sau patru octeți. Luăm exemplul nostru anterior și îl codificăm în UTF-32BE.

Aici, spațiul pierdut este doar uimitor. Chiar și emoji-urile nu ocupă atât de mult spațiu, iată o pizza 🍕 în UTF-32BE.

Avantajul acestei codificări este de a avea toate caracterele de aceeași dimensiune. În acest scop, este aproape niciodată folosit pentru a stoca text, ci servește mai degrabă în API-uri interne. De exemplu, Python 3 îl folosește pentru a reprezenta variabile de text.

Codificări de dimensiuni variabile

In zilele de azi, două codificări de dimensiuni variabile sunt în standardul Unicode, UTF-8 și UTF-16. Maximul lor este de patru octeți fiecare, dar dimensiunea minimă a unui semn este de unul și respectiv doi octeți.

Este, fără îndoială, cea mai utilizată codificare în prezent. Atât pentru stocarea, cât și pentru transferul de informații. Dimensiunea sa minimă este de opt biți și poate merge până la patru octeți pentru unele semne.

UTF-8 are, de asemenea, distincția de a fi total compatibil cu ASCII. Orice caracter ASCII valid este un caracter UTF-8 valid. De asemenea, deoarece este format din cuvinte cu un singur octet, nu este sensibil la endian.

Deoarece aceasta este o codificare de dimensiuni variabile, unele semne sunt alcătuite din mai multe cuvinte. Pentru a putea identifica numărul de cuvinte care alcătuiesc un caracter, UTF-8 plasează aceste informații în primul octet.

  • orice punct de cod cu o valoare mai mică de 128 este codificat pe un octet cu cel mai semnificativ bit la zero (ca în ASCII),
  • celelalte puncte de cod sunt codate pe mai mulți octeți. Primul octet are cei mai semnificativi biți la 1, cu câte 1 sunt câte cuvinte. Deci avem un minim de doi și până la patru 1, urmat de un 0, în timp ce biții rămași sunt folosiți pentru a codifica informațiile. Următoarele cuvinte trebuie să înceapă cu 10 .
Număr de cuvinte Reprezentare binară
10xxxxxxx
2110xxxxx 10xxxxxx
31110xxxx 10xxxxxx 10xxxxxx
411110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Să vedem acest lucru cu câteva exemple concrete. Litera „e” este codificată ca în ASCII. Fie 65hex, fie 101dec, acest lucru dă 01100101bin. Până în prezent, este foarte simplu.

Acum să luăm emoji 😎 ca exemplu. Dacă ne uităm la tabelul Unicode, ne dăm seama că codul său este U + 1F60E sau 128526dec. Cu toate acestea, dacă ne uităm la detaliile de codificare, atât reprezentarea hexagonală, cât și reprezentarea zecimală nu corespund.

Pentru a ne recâștiga valoarea, trebuie să înțelegem codificarea explicată mai sus. Să vedem acest lucru în detaliu.

UTF-16

UTF-16 are o lungime variabilă cu cuvinte pe 16 biți. Astfel, în UTF-16, un semn este fie doi, fie patru octeți. Spre deosebire de UTF-8, UTF-16 nu este compatibil cu ASCII - și, desigur, nici nu este compatibil cu UTF-8.