Estándares ISO 8859-XX (1 byte) e ISO/IEC 2022 (codificaciones multibyte)
Llevemos nuestra atención por un rato a los estándares ISO para caracteres representados en 8 bits, o sea, ocupando exactamente 1 byte.
Estas codificaciones son extensiones al ASCII original, que lograba codificar todos los caracteres que le interesaban en 7 bits.
Habiendo 1 bit "sobrante" en cada byte, es lógico que los fabricantes de computadoras y sistemas intentaran aprovechar ese bit para duplicar la cantidad de caracteres disponibles.
A pesar de que el intento original de IBM, con la página de códigos 437, suplía bastante las necesidades de muchos lenguajes occidentales, quedaban aún pendientes las necesidades de lenguajes con ligaduras y acentos en combinaciones más complejas (el turco, los idiomas nórdicos, Europa del Este), y ni hablar de los lenguajes cuyo alfabeto no se basa en el latín (griego, árabe, ruso, etc.). Peor todavía, lejos estábamos de los idiomas de escritura ideográfica (chino, japonés).
En toda esta historia de cosas mal hechas, y remediadas con criterios incomprensibles y feos, veamos qué papel ha jugado el comité ISO.
Las normas ISO para sistemas de codificación internacional fueron las
ISO 8859 partes 1 a 16.
Las partes 1, 2, 3, 4, 9, 10, 13, 14 y 15 se refieren a variantes de alfabetos latinos.
Las partes 5, 6, 7, 8 y 11 se refieren respectivamente a alfabetos Latino/Cirílico, Latino/Griego, Latino/Árabe, Latino/Hebreo, Latino/Tailandés.
La parte 12, Latino/Devanagari, ha sido luego descartada.
Les adjunto las versiones finales que encontré, de diferentes años, en un archivo comprimido ZIP:
https://foro.rinconmatematico.com/index.php?action=dlattach;topic=65991.0;attach=12338
No hay mucho más que decir, salvo repetir y resumir algunos detalles esenciales que ya hemos mencionado:
* Cada "parte" de la norma ISO 8859 corresponde a una tabla de caracteres, codificados en 8 bits, dando un total de 256 caracteres.
* Los primeros 128 caracteres de cada una de estas tablas siempre coinciden con ASCII.
* Los restantes 128 caracteres varían.
* Los caracteres que la norma ISO 8859 asigna explícitamente son los que tienen códigos desde el 160 al 255, dejando del 128 al 159 indefinidos.
Los caracteres con códigos 128 a 159 son nuevos
caracteres de control.
Su significado no está especificado en las normas
ISO 8859, sino en otras normas, como la
ISO 6429.
Como siempre, las normas ISO no son fáciles de conseguir gratuitamente, así que empecemos con el enlace de Wikipedia:
http://en.wikipedia.org/wiki/C0_and_C1_control_codesSe puede hallar su gemela ECMA 48, que copia y ratifica a ISO 6429 (les dejo el enlace y abajo el archivo adjunto):
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf
Los caracteres de control 142 y 143 tienen un uso especial: permiten alternar a nuevas subtablas de caracteres.
Veamos.
Los caracteres imprimibles ASCII (del 33 al 126) se consideran parte del grupo
G0,
mientras que los caracteres del 160 al 255 se consideran del grupo
G1, de la tabla que se esté usando.
Hay tablas de caracteres que tienen extensiones a nuevos grupos de caracteres
G2 y
G3.
En esos casos, el
caracter de control 142 se usa para indicar que el siguiente caracter se tomará del grupo
G2,
y el
caracter de control 143 es para seleccionar el grupo
G3.
Nota: Los
caracteres de control 142 y 143 no pueden usarse para otra cosa, incluso cuando no haya tales grupos
G2 y G3.
Para ver cómo funciona esto, hemos de referirnos a las técnicas de codificación multibyte, que están estipuladas en la norma
ISO/IEC 2022:
[Recomiendo arduamente la lectura del siguiente enlace]http://en.wikipedia.org/wiki/ISO/IEC_2022Las codificaciones
ISO/IEC 2022 son de ancho variable, es decir, el número de bytes usado para codificar caracteres puede ir variando dentro de la misma codificación, y según el contexto.
Aún así, este ancho variable en la práctica sólo es de 1 o 2 bytes.Mediante secuencias iniciadas con el caracter ESC (código 27), se puede alternar entre los grupos G0, G1, G2, G3, indicando al sistema que la primer y segunda mitad de la tabla "actualmente" se ha de comportar según los grupos seleccionados.
Las secuencias de escapa cambian el "estado" de la codificación, de la siguiente manera:
Inicialmente hay dos grupos de caracteres imprimibles: GL y GR.
En un principio, GL = G0 y GR = G1.
A medida que aparecen secuencias de escape que cambian el estado, los grupos GL y GR pueden ir cambiando, por ejemplo a GL = G2, GR = G3, entre varias otras posibilidades.
Este "estado" nos pone en la situación de una
máquina o autómata de estados finitos.
Todo el tiempo debemos tener en consideración el "estado actual" de la máquina, que en este caso es la particular codificación utilizada para imprimir caracteres.
Hay un par de secuencias de escape, denotadas SS2 y SS3, que sólo cambian el estado para el caracter siguiente.
Éste es el caso también de los caracteres de control 142 y 143 antes mencionados (el primero realiza la operación SS2, y el otro la SS3).
Para alfabetos complicados como el japonés o el chino, existen además secuencias de escape que permiten alternar entre caracteres cuyo ancho es de 1 byte, o bien de 2 bytes.
Las codificaciones
ISO/IEC 2022 se acoplan o comienzan en un modo ASCII corriente, o quizá decimos mejor: ISO/IEC 646.
Estos "estados" en combinación con los caracteres de "ancho variable" son un dolor de cabeza para los programadores.
Introducen arduas dificultades en el análisis de información que se presenta en modo de texto.
Las únicas ventajas de estas normas son las de permitir expresar y transmitir información para lenguajes que, de otro modo, no habría modo de codificarlos (al menos en la época en que estas normas se crearon).
Es algo realmente caótico e indeseable.
Y todas estas complicaciones naturalmente han llevado a la necesidad de un sistema más uniforme y claro: el
Unicode.
Hagamos un comentario adicional:
Windows no se quedó tranquilo con las normas ISO, e implementó versiones modificadas de dichas normas, que son las páginas de códigos 1250 a 1258.
http://en.wikipedia.org/wiki/Windows-1250http://en.wikipedia.org/wiki/Windows-1251http://en.wikipedia.org/wiki/Windows-1252http://en.wikipedia.org/wiki/Windows-1253http://en.wikipedia.org/wiki/Windows-1254http://en.wikipedia.org/wiki/Windows-1255http://en.wikipedia.org/wiki/Windows-1256http://en.wikipedia.org/wiki/Windows-1257http://en.wikipedia.org/wiki/Windows-1258Las correspondencias (por similitud) son las siguientes:
Windows-1250 ---> ISO 8859-2 (Europa Central y Oriental)
Windows-1251 ---> ISO 8859-5 (Cirílico y Ruso)
Windows-1252 ---> ISO 8859-1 y 15 (Latino "usual")
Windows-1253 ---> ISO 8859-7 (Griego)
Windows-1254 ---> ISO 8859-9 (Turco)
Windows-1255 ---> ISO 8859-8 (Hebreo)
Windows-1256 ---> ISO 8859-6 (Árabe)
Windows-1257 ---> ISO 8859-13 (Báltico)
Windows-1258 ---> (Vietnamita)
Todas ellas son codificaciones de 1 byte por caracter.
Ya mencionamos en un post anterior los casos de paginas de códigos de Windows que pueden tener 1 y/o 2 bytes por caracter.