Unicode bajo DOS

La codificación de caracteres unicode, es algo que se está volviendo tremendamente popular en nuestros días, sobre todo, a raiz de la migración sucesiva de Windows ANSI (1.x, 2.x, 3.x, 95, 98, y ME), a sus respectivas versiones con soporte del juego de caracteres unicode, basadas en el núcleo de NT (NT 3.x, 4.x, 2000, XP, 2003, Vista y 2008).

Esto no quiere decir que los entornos basados en NT no soporten ANSI, que de momento si que lo está, solamente indica que a nivel de API, se permiten también codificaciones de caracteres en unicode, que son capaces de representar hasta 65536 caracteres distintos, en contraposición de los tradicionales 256 de ANSI, o 128 de ASCII.

Lo que es más, nos permite ahorrar la complejidad que entrañan las páginas de códigos, pues ahora sólo existe una página de códigos, que incluye todos los caracteres que podamos necesitar.

El porqué no se usó unicode desde el principio, es bastante complicado de explicar, aunque la justicación técnica es en esencia, el consumo de memoria que requiere unicode, que es exactamente al doble de ANSI, y que por tanto, necesita el doble de potencia de cálculo para ser tratado. Es decir, aspectos muy relevantes, cuando las máquinas tenían pocos Kb. de memoria, y su velocidad de proceso estaba en el rango de los Khz o los pocos Mhz.

Unicode se estandariza en 1991 con su versión 1.0 (a día de hoy tenemos ya la 5.1), casi 25 años después de ASCII, pero hace ya más de 15, así que lo que ahora nos parece tan nuevo, y tan inédito, realmente no lo es.

Como prueba de ello, he desarrollado un sencillo programa en C para DOS en modo real, que es capaz de funcionar en un procesador 8088/8086 con un mínimo de 16 Kb. de memoria RAM libre, es decir, una máquina que podría ser el primer PC de 1981.

Lo he escrito con Open Watcom C++ 1.8, aunque hubiera podido compilarlo perfectamente con la versión 8.5 de 1991, que ya soportaba el por aquel entonces emergente estándar unicode.

Se trata simplemente, de un programa que crea un archivo con contenido textual en unicode, pero como he dicho, con la particularidad de ser capaz de funcionar virtualmente en una máquina de hace casi 30 años.

Como podemos ver en su código fuente, la operativa es trivial:

#include <stdio.h>
#include <wchar.h>
void main (void)
{
FILE *pFile;
pFile=fopen("DOSUnico.txt", "wb");
fputws(L"Este es un ejemplo en unicode para DOS\náéíóúàèìòùäëïöüñçÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÑÇ", pFile);
fclose(pFile);
}

Las dos primeras líneas incluyen los archivos de cabecera que vamos a necesitar. El primero el de E/S estándar de C/C++, y el segundo para el juego de caracteres ancho (wide), que nos permitirá manejar unicode.

La tercera y cuarta líneas, delimitan el inicio de la función de entrada main, en este caso, sin parámetros ni de entrada ni de salida, para simplificar, y compactar el código generado, aunque en general, éste no sea el mejor enfoque.

La quinta línea declara un puntero a FILE que será usado para los accesos a archivos, mientras que la sexta, crea un archivo para escritura en modo binario, con el nombre DOSUnico.txt. En la séptima, escribimos en el archivo abierto la cadena de caracteres ancha que se muestra, y por último, cerramos el archivo (en la línea 8), y terminamos main en la línea 9.

Como podemos ver, 9 líneas de código, que tras ser compilado, generan un archivo .COM de apenas 7 Kb. Realmente podrían haber sido algunos menos, pero eso es algo que tocaremos en un futuro.

Bien, y entonces, ¿por qué no había programas que usasen unicode en la época de DOS? Bueno, la respuesta rápida, es que si los había, aunque su número fuera muy, muy, pequeño. Ocurre que eran demasiado especializados, así que apenas tuvieron popularidad.

Debemos tener en cuenta que DOS tiene el problema de su modo texto, que estaba basado en la representación de caracteres ANSI, por lo que si queríamos mostrar en pantalla texto unicode, había que recurrir de alguna forma al modo gráfico. En este sentido, la increíble Zinc Interface Library (ZIL)/Zinc Application Framework (ZAF) de Zinc/Windriver, permitía crear entornos de ventanas, que se podían compilar sin cambios en el código para diferentes plataformas, como DOS, y que además soportaban unicode. Seguro que habéis visto en algún momento el interfaz del Partition Magic de Powerquest/Symantec que imita casi a la perfección el de Windows 9x/2000, a pesar de ser en realidad una aplicación DOS.

El otro argumento, es mucho más nimio. La cultura tecnológica por aquel entonces, estaba bastante menos extendida qye hoy en día, en la mayoría de casos, valía con un programa en inglés, que sería ejecutado en ese idioma por un español, o un chino. Así, no había necesidad de localizar, y si la había, se podía salir del paso utilizando la página de códigos adecuada.

Lo que si hay que dejar claro, es que internamente DOS, no era capaz de manejar unicode, es decir, no se permitía crear un archivo con caracteres unicode en su nombre, o asignarle a un disco una etiqueta con esta codificación, aunque como hemos visto, con las librerías adecuadas, era perfectamente capaz de procesarlos, y representarlos en pantalla.

Tienes para descargar el ejecutable precompilado, así como el código fuente aquí (7 Kb. en formato ZIP).

Deja un comentario