Un rubinist; s Introducere în codarea caracterelor, Unicode și UTF-8; Slacker News

Este foarte probabil să fi văzut o excepție Ruby precum UndefinedConversionError sau IncompatibleCharacterEncodings. Este mai puțin probabil să fi înțeles ce înseamnă excepția. Acest articol vă va ajuta. Veți afla cum funcționează codările de caractere și cum sunt implementate în Ruby. Până la final, veți putea înțelege și remedia aceste erori mult mai ușor.

codarea

Deci, ce este oricum o „codificare a caracterelor”?

În fiecare limbaj de programare, lucrați cu șiruri. Uneori le procesați ca intrare, alteori le afișați ca ieșire. Dar computerul dvs. nu înțelege „șirurile”. Înțelege doar biții: 1s și 0s. Procesul de transformare a șirurilor în biți se numește codificare de caractere.

Dar codificarea caracterelor nu aparține doar epocii computerelor. Putem învăța dintr-un proces mai simplu înainte de a avea computere: codul Morse.

Codul Morse

Codul Morse este foarte simplu în definiția sa. Aveți două simboluri sau modalități de a produce un semnal (scurt și lung). Cu aceste două simboluri, reprezentați un alfabet englezesc simplu. De exemplu:

  • A este .- (o notă scurtă și o notă lungă)
  • E este. (o notă scurtă)
  • O este - (trei puncte lungi)

Acest sistem a fost inventat în jurul anului 1837 și a permis, cu doar două simboluri sau semnale, să fie codificat întregul alfabet.

În imagine puteți vedea un „codificator”, o persoană responsabilă cu codificarea și decodarea mesajelor. Acest lucru se va schimba în curând odată cu sosirea computerelor.

De la codarea manuală la cea automată

Pentru a codifica un mesaj, aveți nevoie de o persoană care să traducă manual caracterele în simboluri urmând algoritmul codului Morse.

Similar codului Morse, computerele folosesc doar două „simboluri”: 1 și 0. Puteți stoca doar o secvență a acestora în computer și, atunci când sunt citite, trebuie interpretate într-un mod care are sens pentru utilizator.

Procesul funcționează astfel în ambele cazuri:

SOS în cod Morse ar fi:

O mare schimbare cu computerele și alte tehnologii a fost că procesul de codificare și decodare a fost automatizat, așa că nu mai aveam nevoie de oameni care să traducă informațiile.

Când au fost inventate computerele, unul dintre primele standarde create pentru a transforma automat caracterele în 1s și 0s (deși nu primul) a fost ASCII.

ASCII reprezintă codul standard american pentru schimbul de informații. Partea „americană” a jucat un rol important în modul în care computerele au funcționat cu informații de ceva timp; vom vedea de ce în secțiunea următoare.

ASCII (1963)

Bazat pe cunoașterea codurilor telegrafice precum codul Morse și computerele foarte timpurii, un standard pentru codificarea și decodarea caracterelor într-un computer a fost creat în jurul anului 1963. Acest sistem a fost relativ simplu, deoarece acoperea doar 127 de caractere la început, alfabetul englezesc, plus simboluri suplimentare.

ASCII a funcționat prin asocierea fiecărui caracter cu un număr zecimal care ar putea fi tradus în cod binar. Să vedem un exemplu:

„A” este 65 în ASCII, deci trebuie să traducem 65 în cod binar.

Dacă nu știți cum funcționează, iată o modalitate rapidă: începem să împărțim 65 la 2 și continuăm până obținem 0. Dacă împărțirea nu este exactă, adăugăm 1 ca rest:

Acum, luăm resturile și le punem în ordine inversă:

Deci, am stoca „A” ca „1000001” cu codificarea ASCII originală, cunoscută acum sub numele de US-ASCII. În zilele noastre, cu computerele de 8 biți obișnuite, ar fi 01000001 (8 biți = 1 octet).

Urmăm același proces pentru fiecare caracter, deci cu 7 biți putem stoca până la 2 ^ 7 caractere = 127.

Iată tabelul complet:


(De la http://www.plcdev.com/ascii_chart)

Problema cu ASCII

Ce s-ar întâmpla dacă am vrea să adăugăm un alt personaj, cum ar fi francezul ç sau caracterul japonez 大?

Da, am avea o problemă.

După ASCII, oamenii au încercat să rezolve această problemă prin crearea propriilor sisteme de codificare. Au folosit mai mulți biți, dar în cele din urmă acest lucru a provocat o altă problemă.

Problema principală a fost că, atunci când citiți un fișier, nu știați dacă aveți un anumit sistem de codificare. Încercarea de a o interpreta cu o codificare incorectă a avut ca rezultat o evidență generoasă precum „ ” sau „Ã, ÂÃ⠀ šÃ‚Â".

Evoluția acestor sisteme de codificare a fost mare și largă. În funcție de limbă, aveați sisteme diferite. Limbile cu mai multe caractere, precum chineza, au trebuit să dezvolte sisteme mai complexe pentru a-și codifica alfabetele.

După mulți ani de luptă cu acest lucru, a fost creat un nou standard: Unicode. Acest standard a definit modul în care computerele moderne codifică și decodează informațiile.

Unicode (1988)

Scopul Unicode este foarte simplu. Conform site-ului său oficial:
„Pentru a oferi un număr unic pentru fiecare personaj, indiferent de platformă, program sau limbă.”

Deci, fiecare caracter dintr-o limbă are atribuit un cod unic, cunoscut și sub numele de punct de cod. În prezent există peste 137.000 de caractere.

Ca parte a standardului Unicode, avem diferite moduri de a codifica acele valori sau puncte de cod, dar UTF-8 este cel mai extins.

Aceiași oameni care au creat limbajul de programare Go, Rob Pike și Ken Thompson, au creat și UTF-8. A reușit, deoarece este eficient și inteligent în modul în care codifică aceste numere. Să vedem exact de ce.

UTF-8: Format de transformare Unicode (1993)

UTF-8 este acum codificarea de facto pentru site-uri web (mai mult de 94% dintre site-urile web folosesc codificarea respectivă). Este, de asemenea, codificarea implicită pentru multe limbaje de programare și fișiere. Deci, de ce a avut atât de mult succes și cum funcționează?