Àrea de Clients
Actualment, només disponible pels clients dels serveis de l'àrea consultoria estratègica i de gestió.
En breu, tots els clients podran enviar i consultar l'estat de les seves consultes i peticions des d'aquí.

UTF-8 i ISO-8859

6 setembre 2010
SHARE THIS
3a09f7b7efc9860297ae86632b5eafea

(Avís : per entendre del tot aquest post, cal saber que a un fitxer hi ha 1s i 0s, entendre què vol dir això, què és un bit, un byte i, el més exigent, què significa “codificació”. A part , allí on hi  diu 10, heu de llegir “u zero”, per això poso l’apòstrof davant)

Durant anys vam estar treballant amb l’estàndard ISO-8959-1. A tot arreu teníem aquesta configuració en fitxers .conf, .xml. Era una inèrcia que venia des del moment en què es va resoldre el tema dels accents, amb l’ASCII extended, que ISO va estandarditzar.

ASCII és un joc de 127 símbols diferents. Calen 7 bits per representar-lo, de manera que un caràcter ASCII es representa amb un 0 i 7 bits al darrere.

ASCII extended vol dir, allargar la llista amb 127 bits. De manera que n’hi ha 254 i calen 8 bits. En aquesta llista hi van afegir  les vocals amb accents, circumflexes o tildes i d’altres símbols (ce trencada, punt volat, etc). En definitiva, per resoldre la codificació de caràcters als europeus, bàsicament. Així aquests caràcters es representem amb un 1 i 7 bits al darrere.

ISO va fer seva aquesta llista afegida i la va anomenar ISO-8859 (i un altre número al final, indicant petits canvis a la llista). Per cada caràcter/símbol necessitem el mínim : 1 byte. En diríem la codificació low-cost (barata però ja t’hauràs d’espabilar).

Unicode

Unicode és una classificació a un altre nivell. Proporciona un número a cadascun dels caràcters coneguts, incloent-hi símbols d’alfabets (tots: els naturals, els de laboratori i els de la ciència-ficció), cares, símbols matemàtics, musicals, jeroglífics, fletxes, fitxes de dòmino, etc. Amb l’expressió “a un altre nivell” vull dir que no diu com es representen (no és una codificació), sinó com s’identifiquen (és una especificació). Unicode, però, és molt més que aquesta taula.

UTF-8, UTF-16 i UTF-32, en canvi, es dediquen precisament a dir com es codifica cadascun dels símbols de dalt. En uns i zeros, lògicament.

Com que el nombre de números assignats és superior al milió (1.114.109 i ha de créixer) amb 8 i 16 bits no podem representar més que un subconjunt dels símbols de la llista. Amb 16 bits podem arribar al 65.636. Amb 32 bits arribaríem a representar-ne 4.294.967.296 (més de quatre mil dos-cents milions), és a dir, tot el conjunt.

De manera que ja tenim com funciona UTF-32. Dedica 4 bytes a cada caràcter, li dóna l’equivelència exacta al número que toca assignar i llestos. Té el problema que ocupa molt d’espai.

UTF-16 intenta ser el més eficient en temes d’espai. És capaç de representar amb estructures de 2 bytes la majoria de fitxers existents. Com que no dóna per tots, s’ho manega, senzillament, afegint 2 bytes al darrere. Hi ha una sèrie de convencions de caràcters no representables per evitar col·lisions i llestos. Això a part de deixar un buit en quant a representativitat, genera bugs i problemes de seguretat .

UTF-8 és el llest del  món occidental. És totalment acordiònic, de manera que segons el conjunt de caràcters a representar pot ocupar des de la meitat que UTF-16 fins més del doble. Per explicar-ho ràpid (no és la idea de l’article explicar algorismes de codificacions):

  • Llegim el primer byte i hi comptem el nombre d’1s consecutius. Això ens diu el nombre de bytes que farem servir per codificar el símbol present.
  • A partir del segon byte usat (si cal que existeixi), observem que comença per un 10 convencional. Això ho fan, per redundar en el fet que no és un primer byte. La resta dels bits representa el número.
  • Un cop sabem quants bytes hem de prendre i quins bits agafar, ens mengem els bits de control (els primers uns i els 10s convencionals)  i ja tenim el número que hem de buscar a la llista Unicode (a sota hi ha un exemple més clar que l’explicació).

La part llesta, doncs, quina és? Resulta que un fitxer ASCII (qualsevol text en anglès) es representa amb codificació de 7 bits. Un 0 (que vol dir que només faig servir aquest byte, 0 d’addicionals) i 7 bits. Tatxan!! Resulta que un fitxer ASCII, a part de ser ISO-8859, també és un fitxer UTF-8! No cal fer la transformació. A part de l’estalvi en espai, clar. Però en canvi és injustificable un fitxer en coreà representat en UTF-8.

Unicode vs ISO-8859

Com se’n dedueix, no hi ha cap coincidència en la codificació en UTF-8 i ISO-8859 a la segona meitat de la taula dels ISOs. En UTF-8 es codifiquen amb dos caràcters i amb ISO, amb un. Tal com queda dit a dalt, es representarien amb un byte que comença per 10 (un caràcter addicional i prou) i el caràcter addicional necessari.

Anem a veure un exemple, la “e” amb accent obert.

“è” té assignat el número 232, que és E8.

En binari 232 es representa com : 1110 1000

Com es codifica en UTF-8?

  • 110 (un total de dos bytes, aquest i un altre)
  • 000 (omplim amb el que seran zeros a l’esquerra)
  • 11 (els dos primers bits de 183. Fins aquí el primer byte)
  • 10 (el següents bytes sempre comencen per 10, segons marca el conveni)
  • 101000 (els bits que queden per representar)

És dir: 1100 0011 1010 1000 (en hexa : C3 A8)

Què passa si vull llegir això segons els convenis d’ISO-8859-1? Tinc dos bytes. Dos caràcters:

C2 -> Ã, en ISO

A8 -> ¨ (dièresi), també en ISO

És a dir , allí on hi ha una “è“, em posa un emprenyador “è

Per la part contrària, què passa si volem representar en UTF-8 allò que està escrit en ISO-8859? Per exemple, aquesta mateixa frase, on diu “àr” (de contrària). Dos caràcters en ISO-8859, és a dir, dos bytes:

à ->E0

r ->72

Per tant : 1110 0000 0111 0010

En UTF-8 llegim: caràcter pel qual necessitem 3 bytes. El segon byte comença per 10? Argh, ans al contrari! –> no representa res.

Això cada visor ho representa a la seva manera. Un interrogant, un quadradet, o qualsevol classe de renec, això sí, codificat.

Tags: - -

About the Author: David Gil

David Gil - Enginyer de software - Col·legiat 675 pel coeinf.cat - A Argus des de febrer de 1999

Trackbacks/Pingbacks

Respon