01 julio 2006

Java y Unicode

El lenguaje Java es un lenguaje muy moderno y con muchas pijerías. Una de ellas es que trabaja totalmente utilizando la codificación Unicode.

Al principio de los tiempos sólo se podía codificar caracteres con el ASCII y el EBCDIC. EBCDIC no tuvo mucho éxito y ASCII se impuso en el mercado de los ordenadores.

Pero ASCII sólo permitía escribir en lenguaje inglesa, los usuarios de otras partes del mundo necesitaban escribir acentos, o letras griegas o hiragana... Entonces surgieron "adaptaciones" de ASCII para cada región del mundo y comenzó el caos.

La organización que todo lo organiza, la ISO, comenzó a estandarizar las distintas codificaciones creando una serie de estándares ISO-8859 de forma que cada lengua o región tuviera el suyo. Europa occidental utilizaba el ISO-8859-1, pero ahora parece ser que se debe utilizar el ISO-8859-15 que añade el símbolo del euro... En fin, un caos.

Luego surgió el Unicode para acabar con todas las codificaciones existentes. Unicode es una codificación universal que incluye todos los símbolos de todas las escrituras actuales y pasadas, y aún tiene espacio para las que puedan ir llegando. Incluye todos los caracteres latinos, los japoneses, los chinos, hebreos, musulmanes, caracteres egipcios... TODOS.

Pero esto añade problemas: ¿quién va a currarse un tipo de letra con los miles y miles de caracteres que existen? Además, este sistema de codificación no puede utilizar un byte para cada caracter como el ASCII y sus hijitos.

Entonces han surgido diversas formas de representar el Unicode (es decir, ha vuelto el caos que se supone que iba a eliminar esta codificación). Los más importantes son UTF-8 y UTF-16. El primero codifica los caracteres occidentales como si fuera el estándar ISO-8859-1 pero si se incluye un símbolo que cae fuera de ese estándar se coloca una marca y a continuación se incorpora el carácter en Unicode. El UTF-16 hace los mismo pero utilizando 2 bytes por cada caracter en vez de uno. Con estos sistemas se reduce mucho el tamaño de los ficheros de texto Unicode y además permite a procesadores de texto antiguos editar los ficheros.

Si abres un fichero totalmente Unicode en el bloc de notas de Windows 98 verás muchísimos caracteres extraños, pero si abres uno codificado con UTF-8 sólo verás unos pocos caracteres raros en los acentos y otros símbolos que no son ingleses.

Java codifica los caracteres con UTF-16, así que cada variable de tipo char ocupa 2 bytes.

Además tiene Unicode totalmente integrado, de forma que puedes crear nombres de variables o de métodos utilizando cualquier cosa que Unicode considere letra. (Pulsa en la imagen para verla más grande)

Por ejemplo puedes crear una variable con la letra griega PI para guardarte el valor de pi. También he creado una variable con símbolo que no sé ni de que lenguaje es, pero Java dice que es una letra. Puedes escribir japonés directamente si tiene un teclado compatible (observa que el nombre de variable japonés lleva acento). Además, curiosamente, Java me ha permitido crear una variable de nombre $.

En resumen, Java es uno de los lenguaje más modernos que hay y eso lo hace que sea lento de ejecutar. Python también tiene mucho soporte para Unicode, pero no está tan integrado como Java.

PD: Escribir variables con esos nombres es lo peor que se le puede ocurrir a un programador que quiera hacer una aplicación portable.
PD2: Supongo que si creas un clase con el nombre en japonés por ejemplo, como al compilarse crea un fichero .class con el nombre de la clase, a lo mejor hay problemas luego a la hora de ejecutarla. Si alguien se aburre que lo pruebe por favor.