Entender los juegos de caracteres y “collation” [parte 2/2]

Entender los juegos de caracteres y “collation” [parte 2/2]

Esta es la segunda y última parte de la entrada publicada el otro día. Trataremos primero el formato de codificación Unicode que almacena los símbolos con longitud variables, UTF-8; y terminaremos comentando el collation u orden lexicográfico que seguro que habéis visto si manejáis algún gestor de base de datos como MySQL.

UTF-8

La aparición de UTF-8 supuso un antes y un después en la tecnología derivada de los juegos de caracteres. Sus dos creadores fueron: Robert C. PikeKenneth L. Thompson (el mismo que creó Unix y fue padre de B el antecesor de C).

Ken Thompson es el de la izquierda

El rasgo más importante es que no existen problemas para representar cualquier tipo de carácter Unicode (cualquiera de cualquier lenguaje que se os pueda ocurrir vaya).

¿Cómo lo consigue? Utilizando una longitud variables de bytes en función de lo raro del carácter. De esta forma algunos caracteres llegan a ocupar 4 bytes, es decir 32 bits, por lo que imaginad la cantidad de caracteres que podemos llegar a tener representados.

Otras ventajas de su uso son las siguientes:

  • Es compatible con ASCII (de vital importancia dada la popularidad de éste)
  • Incluye símbolos que aseguran la sincronía, es decir, es posible conocer el inicio de cada símbolo sin tener que volver a mirar todo desde el comienzo de la comunicación.
  • Y finalmente, no hay problemas de  superposición. Los conjuntos de valores que puede tomar cada byte de un carácter con más de un byte, son disjuntos, por lo que no es posible confundirlos entre sí.

Es el juego de caracteres estándar de la mayor parte de las distribuciones y lo utilizáis a diario además cuando navegáis por Internet o en multitud de aplicaciones.

Collation

Cuando vi por primera vez este nombre al hacer un CREATE TABLE con MySQL, no sabía a que se refería pero vi que dependía tanto del juego de caracteres como del lenguaje en el que estábamos trabajando.

¿Para qué sirve definir la collation u ordenación lexicográfica? Dentro de un mismo juego de caracteres, tenemos que saber cuál es el orden de las letras de cara a hacer ordenaciones en función del lenguaje. Por lo tanto por ejemplo:

  • En inglés la letra ñ se considera extraña e iría después de la z con los demás símbolos raros.
  • Sin embargo en español todo el mundo sabe que la ñ va después de la n

Además dependiendo de éste podremos definir si es lo mismo o no caracteres como: A o a, en función de nuestras necesidades.

Si tenemos un juego de caracteres como UTF-8 que soporta representaciones en todo tipo de lenguajes, necesitaremos definir el collation para saber que las ordenaciones se efectúen correctamente (si sabemos previamente qué lenguaje vamos a usar en la representación de datos, en caso de usar más de uno podemos usar el collation general o implementar este mecanismo a otro nivel).

Ejemplo de diferencias entre distintos collation