Introducción a Unicode y UTF-8

Pequeña introducción sobre Unicode y la codificación UTF-8.

Introducción

UCS Universal Character Set es un sistema universal de codificación de caracteres definido por la norma ISO 10646. Su objetivo es acabar de una vez con tantos sistemas de codificación incompatibles entre sí (ASCII, latin-1, euc*, cp* y cientos más) de modo que para cualquier carácter del mundo, sea chino, cirílico o bengalí, haya un número que lo identifique unívocamente.

Pero, como dice Tanenbaum: “Lo mejor de los estándares es que hay muchos dónde elegir” y esta vez no iba a ser menos. De forma paralela al desarrollo de la norma UCS, un consorcio de empresas creó el proyecto Unicode con el mismo objetivo. Pero no puede haber dos sistemas de codificación universales porque no serían universales. Por suerte se pusieron de acuerdo y desde la versión Unicode 2.0, ISO 10646 y Unicode son compatibles (al menos en lo que a la codificación se refiere).

UTF-8

Pues bien:

UTF-8 es un formato para codificar caracteres UCS (o Unicode) utilizando secuencias de bytes.

UTF-8 es una invención de Ken Thompson (sí, sí, el creador de Unix) como medio para resolver el problema de utilizar Unicode en sistemas tipo Unix. Cuando a Thompson se le ocurrió la idea de UTF-8 (septiembre 1992) trabajaba en el desarrollo de Plan 9 en Bell Labs. Una semana más tarde Plan 9 se convertía en el primer sistema operativo en tener soporte para UTF-8.

¿Cómo funciona UTF-8?

UTF-8 codifica los caracteres del siguiente modo:

  • Los caracteres UCS desde el U+0000 al U+007F se codifican como bytes individuales en el rango [0×00-0×7F] y, por tanto, es compatible con ASCII de 7 bits. Un fichero que contiene únicamente caracteres ASCII de 7 bits se codifica igual en UTF-8.
  • Los caracteres UCS mayores de U+007F se codifican como una secuencia de bytes. Todos los bytes de esa secuencia tienen el bit más significativo a 1, de forma que es muy fácil distinguir si un byte es compatible con ASCII o pertenece a una secuencia multi-byte.
  • El primer byte de una secuencia multi-byte siempre tiene un valor en el rango [0xC0-0xFD] y el número de bits a 1 que contiene indica la longitud de la secuencia. El resto de los caracteres de la secuencia deben estar en el rango [0×80-0xBF].
  • Los bytes 0xFE y 0xFF nunca se pueden usar en UTF-8.

Configuración del entorno (locales)

En cualquier variante moderna del sistema operativo GNU suele haber herramientas para configurar fácilmente el “encoding” por defecto. En Debian GNU/Linux se hace con las famosas “locales”. Las “locales” ofrecen el soporte de localization(l10n) e internacionalization(i18n) que implica cosas como el formato de las fechas, la moneda, la coma decimal, el tamaño del papel, el idioma de los mensajes de los programas, el criterio de ordenación de cadenas, etc, etc.

Si no las tienes instaladas, simplemente ejecuta:

# apt-get install locales

Si ya las tenías instaladas puedes cambiar la configuración de la forma habitual, es decir:

# dpkg-reconfigure locales

Elige es_ES.UTF-8 como encoding por defecto, aunque puedes elegir varias.

Para ver la configuración actual, ejecuta:

$ locale
LANG=es_ES.UTF-8
LANGUAGE=es_ES
LC_CTYPE=“es_ES.UTF-8”
LC_NUMERIC=“es_ES.UTF-8”
LC_TIME=“es_ES.UTF-8”
LC_COLLATE=“es_ES.UTF-8”
LC_MONETARY=“es_ES.UTF-8”
LC_MESSAGES=“es_ES.UTF-8”
LC_PAPER=“es_ES.UTF-8”
LC_NAME=“es_ES.UTF-8”
LC_ADDRESS=“es_ES.UTF-8”
LC_TELEPHONE=“es_ES.UTF-8”
LC_MEASUREMENT=“es_ES.UTF-8”
LC_IDENTIFICATION=“es_ES.UTF-8”
LC_ALL=

Si por cualquier motivo, necesitas que alguna de estas variables tenga un valor diferente del indicado por defecto, instala el paquete localeconf.

GNOME

Para que todo el entorno GNOME sea UTF-8 basta con indicarlo así antes de abrir la sesión en el GDM. Antes de introducir la contraseña abre el menú “Idioma” y escoge la opción “Español (UTF-8)”, o “Predeterminada del sistema” si ya has configurado correctamente las locales.

Referencias