Unicode

2010 marzo 23
por rafadc

Hay muchas maravillas tecnológicas que nos olvidamos que están ahí. Es en ese momento en el que sabemos que han alcanzado la maduez. Y como están allí pues nunca te preocupas por ellas. Hasta que te preocupas. Entonces normalmente estás jodido… En la empresa nos hemos encontrado con que determinados ficheros perdían el encoding y tuvimos que estandarizar el UTF-8 porque se armaban unos pollos bastante ricos. En ese momento me di cuenta que no tengo ni puta idea de esos temas. Como eso hay que solucionarlo… ¡al turrón! En el principio de los tiempos fue EBCDIC. Ya que todo el mundo tecnológico era angloparlante, reducir la codificación a 8 bits de caracteres anglosajones no parecía una mala idea. ¿Hay vida más allá de USA? No lo creo… Con ese encoding podemos utilizar un juego de caracteres ASCII para representar todos los caracteres. De hecho nos vale con 7 de los 8 bits para representar todos e incluso nos reservamos los 32 inferiores para caracteres de control.

Incluso nos podemos encontrar con macarradas como Wordstar que utilizaba el bit sobrante de ASCII para indicar si una letra era la última de la palabra. ¡Señor, que gitanada! Eso si, era lo que había así que…

Todo el mundo era feliz y podían usar su ordenador. Incluso en Espa… en Espa……. ¡Joder! ¿donde está la ñ? Seguro que ahora todos sois muy listos y estais pensando en que es tan fácil como utilizar el bit sobrante para ampliar el espectro de caracteres de 127 a 254… ¡pues pensais igual que la gente que tuvo esos problemas! ¿Que hacemos entonces con el árabe con sus montones de caracteres? ¿Y que hacemos con el ruso? Entonces surgen los codepages que gestionan esos 128 caracteres que tenemos por encima del 128. Hay un codepage para ruso y así mete sus caracteres, otro para griego y meterán sus caracteres, otro para hebreo, etc… Entonces logramos que se puedan mostrar caracteres de distintos idiomas. Eso si, uno de cada vez. Si estamos con la máquina en hebreo no podremos mostrar los caracteres rusos y viceversa. Bonito, ¿verdad? El caso es que justo cuando el mundo se volvía loco se inventó unicode y terminó de completar la locura. Unicode se creó para soportar todos los posible idiomas del mundo mundial. Eso es pedir mucho. Y para ello tienen que hacer bastantes filigranas. En unicode cada letra está representada por un code point. La A mayúscula tiene el suyo, la a minúscula el suyo… así que si quieres escribir la letra que sea solo tienes que referenciar a su code point.

El libro con el standard de unicode. No está mal pero el final es predecible.

Aquí es donde todo empieza a ponerse más pantanoso así que voy a hacer un resumen muy por encima. Cada diferente encoding de unicode (ya que hay un huevo de encodings diferentes: UTF-7, UTF-8, UTF-16…) tiene un número arbitrario de planos que contienen los codepoints, eso si, tiene que ser múltiplo de 16. Cada plano contiene 65536 (256×256) code points. El primero de esos planos se llama Basic Multilingual Plane (BMP) y es común a todos los posibles encondings de unicode.

Entonces referenciaremos cada code point con un U+<posición del code point>. Hay una bonita referencia del Basic Multilingual Plane en el sitio web de unicode. Así, si queremos referencia el caracter a minúscula latina utilizaremos U+0251. Si consultais la referencia vereis que ya en el BMP hay caracteres bastante extraños como U+2615 (HOT BEVERAGE= tea or coffee, depending on locale) o U+26FF (WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE = Japanese self-defence force site).

Como esto era poco lioso, cuando se decidió el standard de unicode se permitió que la codificación de los bytes pudiese ser big endian o little endian. Para indicar el endian que estamos utilizando se hace una marca llamada BOM al principio del fichero. BOM es un acrónimo de byte order marker.

Antes he hablado de los diferentes encodings de unicode. ¿Que es un encoding? Pues es una manera de representar los diferentes caracteres de los planos de unicode. El más común que seguro habréis oído por alguna parte es UTF-8. En UTF-8 cada carácter entre los primeros 128 se codifica usando solo un byte. El resto utilizan entres 2 y 6 dependiendo de la posición. Además los caracteres de esas 128 posiciones coinciden con los ASCII así que un texto en inglés se codificará igual en ASCII y en UNICODE.

Tenemos muchos más posibles encodings como UCS-2 que siempre utiliza 2 bytes, UTF-7 que incluso deja el famoso bit del ASCII libre para que se pueda jugar con él como antaño…

En definitiva. Hay miles de maneras de representar una cadena y nunca llueve a gusto de todos. ¡Que lío es el tema de los idiomas! Con lo bien que estaría el mundo hablando un idioma bello y sencillo como el castellano.

Referencias: http://www.joelonsoftware.com/articles/Unicode.html

http://en.wikipedia.org/wiki/Unicode

One Response leave one →
  1. 2010 abril 26
    andres permalink

    Joder, asi que es por esto por lo que no me acuerdo del codigo U para teclear la ñ en linux con el teclado ingles del portatil de maria… menos mal que ubuntu tiene para configurar shortcuts y esas movidas pero aun asi! creo que lo he configurado mal…

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS

Switch to our mobile site