Unicode en D

Unicode es un estándar global para representar texto en ordenadores. D es totalmente compatible con Unicode, tanto el propio lenguaje como la librería estándar.

Qué y por qué

Los ordenadores, en su más bajo nivel, no tienen noción alguna de qué es texto ya que estos sólo funcionan mediante números. Como resultado, el código de los ordenadores necesita métodos para coger texto y transformarlo desde y hacia una representación binaria. El método usado en esta transformación se llama esquema de codificación, y Unicode es uno de esos esquemas.

Para ver la representación numérica que hay debajo de las cadenas de caracteres en este ejemplo basta con ejecutar el código.

Unicode es único en su diseño ya que este permite representar todos los idiomas del mundo usando el mismo esquema de codificación. Antes de Unicode los ordenadores hechos por diferentes empresas o distribuidos en diferentes áreas tenían dificultades para comunicarse ya que no todos eran compatibles con los diferentes esquemas de codificación usados. Incluso en algunos de ellos era totalmente imposible ver texto creado con otro ordenador.

Hay más información acerca de Unicode en el artículo de la Wikipedia referenciado en la sección “En produndidad” de este artículo.

Cómo

Unicode ha solucionado muchos de esos problemas y está soportado en todos los ordenadores modernos. D ha aprendido de los errores de los lenguajes de programación más antiguos, por lo que todas las cadenas de caracteres en D son Unicode, mientras que en lenguajes como C y C++ no son más que arrays de bytes.

En D los tipos de datos string, wstring y dstring son cadenas de caracteres codificadas mediante UTF-8, UTF-16 y UTF-32 respectivamente, así como el tipo de dato de cada caracter es char, wchar y dchar.

De acuerdo con la especificación, es un error guardar datos que no sean Unicode en las cadenas de caracteres. Hay que tener en cuenta que los programas con cadenas de caracteres que no estén codificadas de forma apropiada fallarán de diferentes formas.

Para guardar otras codificaciones de caracteres, o para conseguir el mismo comportamiento que hay en C/C++, se pueden usar los tipos de datos ubyte[] o char*.

Cadenas de caracteres en los algoritmos que trabajan sobre rangos

NOTA: Algoritmos sobre rangos es una lectura recomendada para comprender mejor las implicaciones de esta sección.

Existen ciertas precauciones importantes a tener en cuenta cuando se trabaja con Unicode en D.

Primero, como una característica desarrollada por conveniencia, cuando se itera sobre una cadena de caracteres usando funciones que se aplican sobre rangos, Phobos, la librería estándar, codifica cada elemento de un string y de un wstring en puntos de código de UTF-32. Esta práctica, conocida como decodicación automática (auto decoding en inglés), significa que la siguiente expresión no lanzará ningún error:

static assert(is(typeof(utf8.front) == dchar));

Este comportamiento tiene muchas implicaciones. La principal, que confunde a muchos desarrolladores, es que std.traits.hasLength!(string) es igual a False. Esto es debido a que, en términos del API de rangos, la propiedad length de las cadenas de caracteres (strings) devuelve el número de elementos de dicha cadena de caracteres, y no el número de elementos del rango sobre el que iteran las funciones.

En el ejemplo se puede ver por qué estas dos cosas podrían no ser siempre iguales. Como tal, los algoritmos sobre rangos en Phobos actúan como si las cadenas de caracteres (strings) no tuvieran información sobre su longitud.

En la sección “En profundidad” hay más detalles técnicos sobre la decodificación automática y qué implicaciones tiene en los programas.

En profundidad

rdmd playground.d