Juegos de Caracteres I: ASCII e ISO-8859

A poco que hayamos usado un ordenador para poco más que jugar al buscaminas nos habremos encontrado con algún fichero que al abrirlo tiene caracteres extraños que hacen del documento algo totalmente ininteligible.

Esto se lo podemos agradecer a los juegos de caracteres y a la historia que han tenido durante las últimas décadas. Vamos a hacer un pequeño repaso (dividido en dos artículos, podéis consultar el segundo aqui y a intentar explicar como funciona el maravilloso mundo de los juegos de caracteres.

¿Juegos de caracteres?

Toda la información que vemos en nuestro ordenador está guardada de forma binaria. Ristras de 0's y 1's que representan nuestra información. Las cadenas de caracteres no son una excepción. Hay muchas maneras de representar caracteres, siendo la más sencilla el identificar cada letra mediante un código numérico. Y vamos a considerar como carácter cada uno de los símbolos que existen en el alfabeto, incluidas mayúsculas y minúsculas. Es decir, el carácter a no es el mismo que el carácter A.

Y es el sistema operativo, mediante este código, el que sabe como dibujar el respectivo carácter… ¿Pero quien decide que código corresponde a cada uno? Y es con esta pregunta con la que empieza nuestro caos.

La informática tuvo sus orígenes en el mundo anglosajón, y por consiguiente los caracteres ingleses fueron los prioritarios a la hora de asignar estos valores numéricos a los distintos caracteres. Y así nació ASCII :)

ASCII

La mayor parte de los computadores direccionan a nivel de byte, y esto de la informática nació en una época en la que el almacenamiento era algo costoso y escaso por lo que la idea de que cada carácter ocupase sólo un byte era algo bastante razonable.

De esos 8 bits (8 bits == 1 Byte) decidieron usar 7 para representar todos los caracteres que ellos creían eran necesarios para cualquier persona. En este grupo nos encontramos aparte del alfabeto inglés, distintos símbolos de puntuación (interrogación, coma, exclamación…) y por último, caracteres de control no imprimibles como el salto de línea, el tabulador, o el valor NULL, el cual como muchos sabrán, tiene el valor 0x00 (los siete bits a cero). Podéis ver que valor tiene exactamente cada carácter en la Wikipedia.

Por ejemplo, y según lo que acabamos de ver, si escribimos en un fichero la cadena Aiba! (guardándolo en ASCII), y abrimos ese fichero con algún lector binario, veremos que el contenido es el siguiente:

01000001 01101001 01100010 01100001 00100001
A        i        b        a        !

Pero hemos dicho que se direcciona a nivel de byte así que… ¿qué pasa con el bit número 8? Pues que sobra, no les hizo falta, así que decidieron usarlo como bit de paridad para comprobar que no había corrupción en los datos (a la hora de mandar el carácter por la red por ejemplo).

Y todo fue muy bonito… hasta que al resto de la humanidad (de habla no inglesa) nos dio por probar aquello de los ordenadores, y vimos que, por ejemplo, no podíamos escribir nuestra preciosa ñ. El estándar ASCII no nos servía.

Pero allá donde hay un estándar… hay otros diecisiete :)

ISO-8859-1

Cuando se planteó representar caracteres de otros alfabetos se vio claramente que ese octavo bit de ASCII que no se usaba era una oportunidad fantástica para ampliar con 128 nuevos códigos el set ya existente.

Por poner un ejemplo que nos pilla cerca, uno de estos juegos que se crearon es el llamado ISO-8859-1, que es un set creado con el propósito de representar los carácteres de la mayor parte de los alfabetos derivados del latín que hay. De esta manera, en esos 128 carácteres extras tenemos letras de nuestro idioma, francés, griego… Es este set el que más se usa actualmente en este lado del charco. Por poner un ejemplo, la palabra Joroña se representa de la siguiente manera:

01001010 01101111 01110010 01101111 11110001 01100001
J        o        r        o        ñ        a

El problema de todo esto es que lo de usar el octavo bit de ASCII (fijaos en que la letra ñ es la única que tiene un 1 en el octavo bit en el ejemplo anterior) es algo que se le ocurrió a mucha gente al mismo tiempo, creándose una infinidad de juegos de caracteres que usaban los siete primeros bits de la misma forma que ASCII (por lo que eran compatible con este) y usaban el octavo para representar los caracteres que les interesaba. Todos estos sets se dicen que son ASCII extendido.

Y con esto de tener una infinidad de juegos distintos surge un enorme problema, y es que un texto escrito en un juego es totalmente incompatible y de hecho se puede ver de forma totalmente ininteligible en un ordenador que tuviese otro distinto. Por ejemplo, la misma sucesión de bits que en ISO-8859-1 nos da la palabra Joroña, en Windows-1253 (una codificación muy usada en Grecia) nos da la palabra Joroρa (atención, no es un carácter p normal)

01001010 01101111 01110010 01101111 11110001 01100001
J        o        r        o        ρ        a

Aquí tenemos el primer origen de los caracteres extraños en nuestros ficheros. Y por esta razón solo los vemos en los caracteres acentuados. Los normales, como son compartidos por ASCII normal, son representados de igual manera en todas las codificaciones existentes. Son los caracteres de ASCII extendido los que, si los vemos desde un set distinto al que fue creado, provocan que el texto se vea totalmente distinto.

[Como curiosidad, si veis por ahí ISO-8859-15, decir que es el mismo que el ISO-8859-1 con algunos cambios menores (como la inclusión del símbolo del euro).]

Así pues, estaba claro que esta situación había que arreglarla. Y un comité se puso manos a la obra, creando lo que ahora conocemos como Unicode, el Valhala de las codificaciones. La que las uniría a todas. Un set que promete incluir todos los posibles carácteres que existen en nuestro planeta, incluídos el Klingon o el Élfico (no, no es coña).

Pero esto, amigos, queda para la segunda parte de este artículo ;)

Comentarios