Juego de caracteres. UNICODE

Los juegos de caracteres son, a medida que las aplicaciones se internacionalizan, una auténtica pesadilla para los programadores.

Las aplicaciones reciben ficheros con diferentes codificaciones, que vienen de diferentes programas en los que un determinado carácter se pueden representar de manera diferente.

El tiempos cada zona/área en el mundo tenía su juego de caracteres, de tal forma que un programa leía bytes y los traducía según el juego de caracteres que tuviera configurada el sistema. Esto producía que apacieran caracteres raros en el mejor de los casos.

La solución a este problema vino de la mano del UNICODE, aunque a día de hoy se sigue sufriendo este problemas por la gran variedad de aplicaciones que hay.

Los lenguajes de programación siempre habían considerado que un byte era un carácter y como en un byte podemos meter 255 caracteres, entonces podríamos representar hasta 255 caracteres diferentes. En las épocas del ms-dos, en europa había para cada zona (Este, Central, Oeste) diferente juegos de caracteres. El cp850 es que tocaba a Europa Oeste.

Luego llegó el Window y definió un conjunto de juegos de caracteres denominados ANSI. Así nace el Windows-1252 que es el equivalente al cp850 de msdos.

Se normalizan los juegos de caracteres por la ISO naciendo juegos de caracteres como el ISO-8859-1, que es el equivalente ISO del Window-1252.

Pero todos estos juegos de caracteres estaban conceptualizados como un byte un caracter.

UNICODE trata de resolver este problema y así como el ISO-8859-1 contiene 256 puntos el UNICODE V6 contiene 248,966 puntos asignados. LOs lenguajes de programación deben de crear otra manera de trabajar con cadenas que no sea un byte un carácter y esto complica los lenguajes.

En la actualidad los sistemas operativos internamente trabajan con unicode y los lenguajes de programación manejas estructuras de cadenas con representación multibyte por caracter.

Los lenguajes de programación suelen trabajar almacenando cada carácter en 2 o 4 bytes en memoria. Almacenar la letra a con código hexa 41 en cuatro bytes es un desperdicio de memoria. Pero cuando lo tenemos que transmitir o almacenar en disco, la cantidad de espacio desperdiciado es grande.

Para solucionar este problema nace el UTF-8 un sistema de codificación de caracteres unicode. Este sistema usa un byte para los caracteres del código ascii (el código más antiguo). Recordar que este código ascii no admite la Ñ ni los acentos. Los caracteres unicode que corresponden al iso-8859-1 (que son lo europeos occidentales) se codifican en 2 bytes. Los caracteres Chinos Koreanos Japoneses (CJK) se codifican en utf-8 con varios caracteres.

Esto nos permite optimizar el tamaño, teniendo en cuenta que los caracteres del código ascii son los más usados. Otra cosa que nos permite el utf-8 es crear ficheros que contengan caracteres CJK y caracteres del código ascii.

La popularidad del html, es la que es imprescindible el uso de diferentes lenguajes, el aumento del uso de los servicios web, en los que la base es el xml, ha llevado a que el uso del utf-8 como forma de serializar unicode sea la más usada.

Conclusión:

El unicode ha resuelto la torre de babel de los juegos de caracteres. Por otro lado el UTF-8 ha resuelto el problema de que un fichero, una página html, en una base de datos pueda haber caracteres que de manera tradicional no se podían mezclar.

Para los programadores, los lenguajes de programación hacen transparente el trabajo de manejar esta complejidad, aunque se presentan problemas actualmente cuando recibimos ficheros y no conocemos cómo han sido creados.

También se presentan problemas en la programación cuando leemos de una base de datos que está en ISO-8859-1 y tenemos que generar páginas web en UTF-8 si no tenemos el cuenta esto.

Curiosidades

En unicode están las fichas del dominio

También tenemos las cartas de baraja

y un montón de cosas más.

En https://www.utf8-chartable.de/unicode-utf8-table.pl podeis explorar los diferentes segmentos que tiene el unicode.

Referencias

Para ver los código unicode https://unicode-table.com/es/

Programando con unicode https://unicodebook.readthedocs.io/index.html

Conversor https://www.branah.com/unicode-converter

Utf8 encoding https://www.utf8-chartable.de/unicode-utf8-table.pl