Autor Tema: Número 2. (2013) - 2 Codificación de caracteres

0 Usuarios y 1 Visitante están viendo este tema.

30 Junio, 2013, 07:37 pm
Respuesta #10

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
ISO/IEC 646, ASCII y trigrafos

Hacia el año 1983 se estableció la norma ISO/IEC 646, un conjunto de caracteres codificados en 7 bits para intercambio de información.
Fue ratificado por la norma europea ECMA 6.
El ISO/IEC 646 es básicamente lo mismo que ASCII, con pequeñas diferencias.
Lo que se hace es esto:

Se tomaron los caracteres de la tabla de 7 bits de ASCII, y se dejaron fijos los caracteres de control, los dígitos, las letras, y algunos otros signos de puntuación.
Sin embargo, algunos de los códigos que en ASCII se asociaban a signos de puntuación poco utilizados, se dejaron "variables", vale decir, aptos para ser reasignados en cada país según las necesidades locales.
Estos casilleros corresponden a los códigos con números 34, 35, 36, 39, 44, 45, 47, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126.

Como de costumbre, le voy a seguir robando material a Wikipedia.
La dirección es ésta:

http://en.wikipedia.org/wiki/ISO/IEC_646

En esa dirección se pueden ver detalles de algunas abreviaturas que mostraré enseguida, y que no explicaré demasiado.

En la primer imagen vemos la tabla de caracteres de ISO/IEC 646, con diversos colores que la gente de Wikipedia ha elegido.
Los casilleros en color distinto a gris tienen caracteres fijos, y cuyo significado es el mismo que en ASCII.
En cambio, los casilleros en color gris son los que pueden variar según el país.
Algunos de esos caracteres, si bien se dejan disponibles para dicha variación, resulta que han permanecido constantes en todas las versiones locales, y por eso es que figura el caracter propiamente dicho allí, como si fuese "fijo".
Estos caracteres "variables" pero "fijos" son los de código decimal 34, 39, 44, 45, 47, 95, cuyos caracteres son: " ' , - / _




En la segunda imagen vemos las distintas versiones locales (en cada columna) y cómo los caracteres variables se han definido en cada caso.
La columna US es la que nos devuelve otra vez al tradicional ASCII.





Debido a que ECMA 6 ratifica (y repite) la norma ISO/IEC 646, y dado que los documentos ECMA son de más fácil acceso, dejo adjunto en este post un PDF con dicha norma, que nos va a servir para tener a mano los detalles técnicos:

https://foro.rinconmatematico.com/index.php?action=dlattach;topic=65991.0;attach=12336



Como es fácil de comprender, esos pocos casilleros "variables" que nos deja la norma ISO 646 para "maniobrar" no son la gran cosa.
Hay idiomas que son muy complejos, y requieren letras acentuadas de muy diversas formas.
Lo que se hizo en un principio fue considerar combinaciones de dos caracteres, uno de los cuales fuese un acento, y el siguiente la letra acentuada.
Así por ejemplo, a la diéresis ¨ le seguiría una u, para interpretarse como ü.
Esto tiene sentido en una impresora, tal como se haría en una máquina de escribir.

Estas combinaciones de caracteres no son muy prácticas para los programas de computación.
Además, es fácil imaginar situaciones en que estas combinaciones no alcanzan.
Hay idiomas profusamente acentuados, con ligaduras y otro tipo de marcas especiales.
No es posible cubrir todas las variantes apelando a unos pocos caracteres "aptos" para "variantes locales".



Sin embargo, no debemos ver en la norma ISO 646 un intento de cubrir todas las necesidades locales,
sino más bien de "normalizar" una situación caótica que se vivía en aquellos días, en que cada país adoptaba las convenciones que mejor le venían en gana, con grandes riesgos de incompatibilidad entre sistemas.
Así, mediante la normalización, se llegó a un acuerdo de cuáles serían los caracteres invariantes, o sea, aquellos que no pueden variar de un país a otro, y cuáles serían los caracteres variables.



Esta variabilidad trajo sus inconvenientes en el mundo de la programacion.
Hay signos que son necesarios en algunos lenguajes de programación, pero que se vuelven inaccesibles en las variantes locales de ISO 646.
Para remediar esto se inventaron los trigrafos, que son combinaciones de 3 caracteres invariantes, y que representan en realidad un solo caracter especial.
Los trigrafos son los siguientes:

http://msdn.microsoft.com/es-es/library/bt0y4awe.aspx



Trígrafo    Caracter de puntuación representado

??=              #
??(               [
??/               \
??)               ]
??'               ^
??<              {
??!               |
??>              }
??-              ~




En sistemas de computación en los que se use la norma ISO 646 en vez de ASCII, hay que tener en cuenta estos trigrafos.
También se los ha de tener en cuenta si es que hay preocupación por la portabilidad de los programas hacia plataformas en los que se desconoce el tipo de norma usada en los archivos fuente de los programas.

Así, una sentencia en C como la siguiente:

{ a[0] = (b || c); }

tendrá este aspecto con trigrafos:

??< a??(0??) = (b ??!??! c); ??>

El uso de trigrafos nos daría, en tal caso, una manera segura de representar signos de puntuación ASCII que posiblemente no estén disponibles en algún sistema aferrado a la norma ISO 646.

30 Junio, 2013, 10:02 pm
Respuesta #11

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
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_codes

Se 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_2022

Las 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-1250
http://en.wikipedia.org/wiki/Windows-1251
http://en.wikipedia.org/wiki/Windows-1252
http://en.wikipedia.org/wiki/Windows-1253
http://en.wikipedia.org/wiki/Windows-1254
http://en.wikipedia.org/wiki/Windows-1255
http://en.wikipedia.org/wiki/Windows-1256
http://en.wikipedia.org/wiki/Windows-1257
http://en.wikipedia.org/wiki/Windows-1258

Las 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.