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

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

22 Febrero, 2013, 04:24 pm
Leído 33587 veces

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Codificación de caracteres

Abstract: Desarrollaremos los aspectos técnicos de la codificación de caracteres en el mundo informático. Los dos pilares fundamentales que queremos desarrollar son los estándares ISO/IEC 646 (que corresponde a los famosos caracteres ASCII) y el ISO/IEC 10646 (cuyo desarrollo va en paralelo con Unicode), que intenta englobar todos los caracteres relevantes en el intercambio de información en el mundo actual.

Me convencí a mí mismo de colocar esta discusión como un artículo de la revista, tras advertir que el tema presenta varias complejas ramificaciones.
Intentaré, no obstante, mantener un objetivo claro y una exposición concreta.

Hay muchas cuestiones técnicas, prácticas, históricas y hasta filosóficas que podríamos tener en cuenta. De un modo u otro tocaremos esos aspectos, pero siempre pensando que no son lo importante.
Aquí la discusión central estará guiada hacia el intento de comprender qué son los caracteres en el mundo de la computación y las telecomunicaciones, y cuál es la estandarización actualmente aceptada.

También es posible que de vez en cuando vayamos a curiosear en los lenguajes de programación, o en los sistemas de computación, a ver cómo lidia cada uno de ellos con este asunto.



Ya que vamos a hablar de caracteres, vendría bien una definición para comenzar.
Para mí no sería fácil dar una tal definición, puesto que tendría que pensar en cuestiones filosóficas, además de indagar en conceptos de áreas del conocimiento que no conozco, y no me son afines.

Me voy a conformar con la idea intuitiva que todos más o menos tenemos de caracter:

Un caracter es una "cierta" unidad de información.

Eso no parece ser una definición muy específica, sino un "cuentito de hadas de 1 renglón".

He hecho el ensayo de construir con mayor rigor el concepto de caracter, y he llegado a algo que finalmente me resultó agradable, y mucho más preciso.
Pero no voy presentarles esa definición aquí, porque quiero evitar toda discusión sobre este tema.

Sólo diré que, en general, los documentos en los que se definen los estándares internacionales de diversas cuestiones de la informática, definen el concepto de caracter como una entidad más bien abstracta.
Es decir, el caracter no es el "dibujito de la letra, esa que aparece ahí en la pantalla", ni tampoco es el código binario interno conque la computadora transmite la información.
El caracter "vive" aún en la mente colectiva humana del ser humano. Está afuera de la computadora.

Problema cognitivo: ¿Lo siguiente es un rectángulo?

---------------------------------------------
|                                           |
|                                           |
|                                           |
|                                           |
---------------------------------------------



Si dudamos por al menos una millonésima de segundo, es que nos hemos topado con aquella parte de nuestra mente que elige dar significados a cualquier cosa que anda "dibujada" por ahí.

A nivel informático, "eso de ahí" no son más que unos caracteres, o si se quiere, unos bits que han generado un efecto gráfico en la pantalla. Decir que eso es un "rectángulo", es algo que sólo un ser humano podría hacer.



La definición dada por la normativa ECMA 6 dice así:

Caracter: Un miembro de un conjunto de elementos usados para la organización, control o representación de datos.

Ahí está pensando como "un miembro" de un cierto "conjunto".
Esos miembros, y ese conjunto, son entidades mentales abstractas, que a su vez se aceptan como parte de una convención entre los seres humanos.

Los caracteres no "viven" en la computadora, sino en "en el imaginario social".  :o :o

22 Febrero, 2013, 05:37 pm
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Sistemas de codificación de caracteres

Lo que sigue es un esbozo muy informal del tema.
Quisiera no entrar demasiado en los detalles históricos.



Cuando se intenta trasmitir información, y los medios que se utilizan para ello tienen limitaciones, requiere que las personas se conformen con un conjunto reducido de elementos lingüísticos a representar, y que intenten apañarse sólo con ellos.

Un ejemplo claro de esto fue la invención del telégrafo, que utilizaba el código Morse para enviar información, el cual mediante sonidos cortos, largos, y silencios, las letras del alfabeto, números, y algunos signos de puntuación.

Wikipedia: Código Morse

Al iniciar la historia de la informática, la limitación de las computadoras estriba en la necesidad de codificar todos los datos con bits: 0 y 1.
Esto obliga a que asociemos una secuencia de bits a cada letra, dígito o signo de puntuación que nos interesa representar.

De entrada esto es propenso a que haya ambigüedad en el tratamiento de la información, porque hay que establecer qué secuencias de bits se asocian a qué elementos lingüísticos.

En lo que sigue hablaré de "caracteres" en el sentido abstracto que dimos en el primer post, y ya no esquivaré el uso de esa terminología diciendo cosas no muy determinadas como "elemento lingúístico".

Se hizo práctica común seleccionar un juego de caracteres, los más usados en cada país, y representarlos con una determinada codificación binaria (0s y 1s).
Si el objetivo es entenderse, no puede permitirse que cada individuo use la codificación que se le antoje.

De esa necesidad han surgido diversos intentos de estandarización.
El más famoso de todos es quizá ASCII.
Si bien su origen es de Estados Unidos, fue ratificado por las normas internacionales ISO, con la nomenclatura ISO/IEC 646, y también fue adoptado por la normativa de origen europeo ECMA 6.

Nota: Uno de los objetivos de estas notas es que los lectores le pierdan el miedo a esas siglas de aspecto ingenieril, y se acostumbren a verlas, entender qué dice cada una, cuáles son sus diferencias, y finalmente llegar a una comprensión lo más completa posible del estado actual de cosas en la vida de los caracteres informáticos.

Quienes deseen indagar en la historia de estos estándares, y sus mutuas interrelaciones, les puedo recomendar los artículos de Wikipedia en inglés, que están bastante completos.

http://en.wikipedia.org/wiki/ASCII
http://en.wikipedia.org/wiki/Extended_ASCII
http://en.wikipedia.org/wiki/ISO/IEC_646
http://en.wikipedia.org/wiki/Universal_Character_Set
http://en.wikipedia.org/wiki/Unicode

La lista se puede ampliar.

Ocasionalmente puede ser relevante que analicemos las relaciones históricas entre diversos estándares.



Digamos que el código ASCII establece convenciones para representar caracteres mediante un máximo de 7 bits.
Los primeros 32 caracteres de la tabla ASCII se usan para tareas especiales, o de control.
En los dispositivos de impresión, se usan para indicar saltos de línea, retorno del carro, avance de formulario, etc.

En la pantalla de una computadora, los caracteres de control cumplen funciones similares a las de una impresora.

Suele haber un caracter que se usa para emitir un sonido de alerta, un beep.

En los archivos de texto, se indica el final del documento con un caracter de control, que puede ser diferente en cada sistema operativo, o puede que no haya tal caracter finalizador.

En el lenguaje de programación C, y otros que siguen sus convenciones, se usa el caracter con código 0 para indicar que una cadena de caracteres ha terminado. Como consecuencia de esto, una cadena de caracteres en C no puede contener el caracter 0.

La tecla "Escape" tiene asociado un caracter de control, así como la tecla "Backspace" (borrar un caracter a la izquierda), y la tecla "Tab" (tabulador).

El primer caracter que no es de control, codifica un "espacio en blanco", generable por teclado con la "barra especiadora".
Los siguientes caracteres de la tabla se llaman "caracteres imprimibles", y corresponden a letras del alfabeto inglés, dígitos, y algunos signos de puntuación, entre otros.

Hacia el final de la tabla hay un solitario caracter no imprimible: se trata de otro caracter de control, asociado esta vez a la tecla "Delete" (borrar desde la posición del cursor a derecha).



La tabla ASCII ha tenido algunos pequeños cambios, así como adaptaciones a las necesidades de otros países.
Debido a que las unidades de información en las computadoras han sido, históricamente, en forma de unos bytes que contienen 8 bits cada uno, resulta que hay 1 bit "de sobra" en la codificación ASCII, que algunos países pueden usar para sus necesidades locales, es decir, para codificar nuevos caracteres.

El código ASCII es bastante mezquino: intenta codificar la menor cantidad de caracteres posibles, y aquellos que se usan sobretodo en Estados Unidos. ¿Acaso el mundo se termina ahí?

La primer tendencia fue la de modificar ASCII para cada ocasión y necesidad, y eso no es algo cómodo.
Cuando diversos países requieren intercambiar información, en varios idiomas distintos,
se empieza a sentir la necesidad de un código más amplio, que contenga en su seno caracteres útiles para todos los idiomas, y que sea universal.

Pasando por diversos intentos, la uniformación más importante del universo de caracteres informáticos fue la aparición de Unicode. En este código se usan 16 bits (o sea, 2 bytes de 8 bits), para representar todos los caracteres del mundo...

Obviamente, se pretendía que "todo quepa" en un paquete de 16 bits, pero la verdad es que Unicode en su versión original no fue suficiente para satisfacer las necesidades de todos los países.
Como resultado de eso, ha habido que ampliar Unicode, aunque también surgieron otras iniciativas, como el UCS, contemplado en la norma ISO/IEC 10646.

Esta norma era diferente de Unicode en un principio, pero finalmente las circunstancias parecen haber obligado a que ambos conjuntos de caracteres coincidan.


22 Febrero, 2013, 08:27 pm
Respuesta #2

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
ASCII

Comencemos con el primer estándar bien definido del que muchos de nosotros tenemos conciencia, y que aún hoy en día prevalece, aunque bajo otros nombres.

Aquellos interesados en los detalles históricos, pueden hojear el documento original de 1963 del ASCII:

http://www.wps.com/projects/codes/X3.4-1963/index.html

Se debe ser precavidos, ya que ha habido muchos cambios importantes desde esa primera versión original.

Para jugar con la tabla ASCII actual, se puede por ejemplo a esta prolija página:

http://www.elcodigoascii.com.ar/



En ASCII, a cada número binario, entre 0 y 127 inclusive, llamados cógitos, el estándar ASCII asocia un caracter. Hay 33 de ellos que son no imprimibles, también llamados de control, puesto que sirven de señalizadores en los dispositivos informáticos para realizar acciones de diverso tipo.

Se reserven los códigos del 0 al 31, y el 127, como caracteres de control.
El resto, del 32 al 126, son caracteres imprimibles, lo cual quiere decir que representan información que podemos ver gráficamente.

El primer caracter imprimible, el número 32, se usa para representar el espacio en blanco.
Los códigos de caracteres se agrupan según ciertos criterios:

* Del 33 al 47 representan signos de puntuación.
* Del 48 al 57 representan dígitos decimales.
* Del 58 al 64 son otros signos de puntuación.
* Del 65 al 90 representan letras mayúsculas del alfabeto inglés.
* Del 91 al 96, más signos de puntuación.
* Del 97 al 122, van las letras minúsculas del alfabeto inglés.
* Del 123 al 126, más signos de puntuación.

Los teclados occidentales en general son muy parecidos, e imitan la disposición de teclas de las antiguas máquinas de escribir, en el ordenamiento "QWERTY".
Hay variaciones según los países.

En general, hay tres filas de teclas que contienen las letras del alfabeto, y encima de ellas una fila con los dígitos.
Arriba de cada dígito hay un signo de puntuación, que puede generarse presionando la tecla SHIFT.
El código de los signos de puntuación que está arriba del dígito en el teclado de Estados Unidos, parecieran tener la intención de ser "algo así" como el código del dígito con el que comparten tecla, menos 14.
Pero esta regla de restar 14 no es válida en general.

En cambio, sí tenemos otras reglas bastante precisas:

El dígito N tiene código ASCII 48 + N.
La N-ésima letra mayúscula del alfabeto inglés tiene código ASCII 64 + N.
La N-ésima letra minúscula del alfabeto inglés tiene código ASCII 96 + N.

Cualquier caracter ASCII puede generarse con el teclado, dejando presionada la tecla ALT, y escribiendo en el teclado numérico el código del caracter.
Así, ALT 70 generaría una letra F.

Los caracteres de control pueden generarse directamente con el teclado de la misma manera,
pero también hay un modo alternativo usando la tecla CTRL.
Para ello, para generar el caracter de control con código M,
hay que dejar presionada la tecla CTRL al tiempo que se presiona aquella tecla que genera el caracter con código ASCII 64 + M.  :o :o

Por ejemplo, CTRL D general el caracter de control con código ASCII 4,
ya que D tiene código 68 = 64 + 4.
De modo similar, dado que el caracter de control para la tecla ESCAPE tiene código ASCII 27,
se ha de generar con la combinación de teclas CTRL [, pues el corchete izquierdo [ tiene código ASCII 91 = 64 + 27.

El caracter de control con código 0, se generaría con CTRL @, pero dado que este signo comparte tecla con el dígito 2, se presiona directamente CTRL 2. (Es posible que esto no funcione en teclados para idioma español).
Si nos fijamos, esto es consecuente con la regla anterior, ya que @ tiene código ASCII 64 = 64 + 0,
permitiendo generar el ASCII 0 en combinación con la tecla CTRL.

No nos vamos a dedicar a generar caracteres de control.
Sin embargo, es útil saber esta regla de "restar 64", porque permite que entendamos algunos textos en donde los caracteres de control se indican mediante el metasigno ^ seguido de un caracter cuyo código ASCII es 64 + M.

O sea, vamos a ver que los caracteres de control se indican mediante:

^@, ^A, ^B, ^C, etc.

Aquí se está interpretando al caracter ^ como un indicador de la tecla CTRL, la cual no tiene caracter asociado.

Sin embargo, si en un archivo de texto escribimos algo como ^B, eso no equivale, claro está, al caracter de control que surge de presionar las teclas CTRL B.

No obstante, el caracter ^ por sí solo no tiene gran utilidad.
Tiene sentido que haya, sin embargo, una tecla con el símbolo ^, porque permite generar letras con acentos circunflejos. Por ejemplo, \( \textsf{\^a,\^e,\^i,\^o,\^u} \).

Si presionamos ALT 127, nos aparece un pequeño pentágono. Sin embargo, ese caracter no es imprimible (no sale en la impresora), aunque puede que a veces se visualice en la pantalla. Representa la tecla DELETE.



Por más que la tabla de caracteres ASCII esté repetida y una otra vez por todo el mundo como un mantra, la vamos a repetir acá también:

Caracteres de control:

  • 0: ^@ - Caracter nulo.
  • 1: ^A - Inicio de encabezado.
  • 2: ^B - Comienzo del texto.
  • 3: ^C - Fin del texto.
  • 4: ^D - Fin de la transmisión.
  • 5: ^E - Consulta.
  • 6: ^F - Enterado - comprendido.
  • 7: ^G - (Sonido-pitido-campanilla).
  • 8: ^H - Retroceso o borrar 1 caracter a izquierda.
  • 9: ^I - Tabulador horizontal.
  • 10: ^J - Avance de línea.
  • 11: ^K - Tabulador vertical.
  • 12: ^L - Avance de formulario.
  • 13: ^M - Retorno de carro.
  • 14: ^N - Desplazar salida.
  • 15: ^O - Entrar en modo Shift.
  • 16: ^P - Escape de enlace de datos.
  • 17: ^Q - Control de dispositivo 1.
  • 18: ^R - Control de dispositivo 2.
  • 19: ^S - Control de dispositivo 3.
  • 20: ^T - Control de dispositivo 4.
  • 21: ^U - Confrimación negativa.
  • 22: ^V - Inactividad sincrónica.
  • 23: ^W - Fin del bloque de transmisión.
  • 24: ^X - Cancelar.
  • 25: ^Y - Fin del medio (¿de transmisión?).
  • 26: ^Z - Sustituir.
  • 27: ^[ - Escapar.
  • 28: ^\ - Separador de archivo.
  • 29: ^] - Separador de grupo.
  • 30: ^^ - Separador de registro.
  • 31: ^_ - Separador de unidad.
  • 127: ^? - Eliminar (DELETE).

Como se ve, con CTRL ? se genera el caracter de control DELETE, con código 127.
Aquí la regla de "restar 64" no podría aplicarse, pero si nos imaginamos que DELETE, por ser el "último" caracter de la tabla, puede pensarse como (dando la vuelta), uno que está "antes" del primero de todos (el 0), entonces lo estaríamos pensando como que si tuviera código "-1", y así se obtiene con CTRL ? debido a que el caracter ? tiene código 63 = 64 + (-1).



Como se puede apreciar, los significados dados a los caracteres de control actúan como señaladores en la transmisión y organización de datos transmitidos por dispositivos informáticos.
En realidad este significado es muy obsoleto en la mayoría de los casos, pues se refiere a convenciones adoptadas para imprimir datos en los antiguos teletipos, o en las impresoras de matriz de puntos.

Hoy en día todo eso ha quedado atrás, pues los dispositivos han evolucionado mucho, y se conservan sólo algunos caracteres de control en uso,
que todavía sirven para interpretar los archivos de texto sencillos (sin formatos), que son los famosos archivos de extensión TXT.

Por otra parte, el significado de esos caracteres puede que no sea respetado por los distintos sistemas operativos, ni por los diferentes programas que hagan algún tipo de manejo de datos.
Tampoco es necesario que se respete ese significado en los protocolos de transmisión de datos por Internet, o redes en general, ni siquiera en la comunicación de la computadora con los periféricos.

Según la ocasión, esos significados pueden cambiarse a conveniencia.
Sin embargo, hay algunos casos que conservan su significado de modo "clásico", como los que se indican con secuencias de escape en el lenguaje C, correspondientes a los códigos ASCII del 7 al 13:

  • 7: \a - (Sonido-pitido-campanilla).
  • 8: \b - Retroceso o borrar 1 caracter a izquierda.
  • 9: \t - Tabulador horizontal.
  • 10: \n- Avance de línea.
  • 11: \v - Tabulador vertical.
  • 12: \f - Avance de formulario.
  • 13: \r - Retorno de carro.

Como se puede apreciar, tras el caracter de escape \ (barra invertida), va una letra, que nada tiene que ver con la regla de "restar 64" que antes habíamos dolorosamente aprendido.

En general conviene suponer que los caracteres de control pueden cambiar su significado de un sistema a otro, así que no conviene aprenderse esos números de código.
Aún en el caso de que los estándares se tomen el trabajo de fijar significados para esos códigos, es probable que los programas y demás sistemas informáticos redefinan el sentido de esos códigos.

Por ejemplo, en sistemas MS-DOS y Windows, en línea de comandos, muchos de los caracteres de control no significan nada.
Mientras que CTRL C significa "interrumpir proceso", CTRL P significa "imprimir lo que hay en pantalla", CTRL Z significa "fin de archivo de texto".

Hay sistemas en los que el "retorno de carro" seguido del "avance de línea" son dos cosas distintas, representadas por una secuencia de 2 caracteres de control distintos, mientras que en otros se utiliza un solo caracter de control que hace las dos cosas juntas.

En la mayoría de compiladores del lenguaje C se utiliza la secuencia de escape \e para indicar el ASCII 27 (caracter ESCAPE), aunque esto no está definido por el estándar ISO.

El sentido de ASCII 127 ha variado en distintos sistemas.
Parece extraño que haya un caracter de control "suelto", aislado de la lista de los primeros 32.
En la prehistoria  :P cuando se usaban los teletipos, se usaba el ASCII 127 para poner una marca de borrado, ya que en binario el 127 está formado por puros 1s, que imagino que se usaban para indicar que estaban "todos los bits tachados".




Dado que en la actualidad se sigue conservando la convención de dejar los códigos 0 a 31 como caracteres de control, es buena idea utilizarlos en nuestros programas para fines especiales, y así "dejar en paz" a los caracteres imprimibles, que se usarían sólo como el trazo de texto que representan.

Sin embargo, no podemos asegurar que todo el mundo respete esta práctica de apariencia saludable.
No sabemos si hay gente que utiliza algunos caracteres de la "zona de imprimibles" como "caracteres de control" en alguna aplicación o sistema específico.

En las fuentes de texto más comunes, usadas en Internet (o sea, en páginas HTML), Windows, y quizá también Linux (digo "quizá", porque no estoy seguro del todo), podemos esperar que no haya superposición entre los caracteres de control y los caracteres imprimibles.



Pasemos finalmente a exhibir los caracteres imprimibles de la tabla ASCII:

  • 32:    (espacio en blanco)
  • 33 a 47:   ! " # $ % & ' ( ) * + , - . /
  • 48 a 63: 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
  • 64 a 79: @ A B C D E F G H I J K L M N O
  • 80 a 95: P Q R S T U V W X Y Z [ \ ] ^ _
  • 96 a 111: ` a b c d e f g h  i j k l m n o
  • 112 a 126: p q r s t u v w x y z { | } ~

La razón para haberlos agrupado en conjuntos de 16 códigos, es para entender mejor su representación binaria.

Les dejamos como ejercicio a los lectores jugar con la representación binaria de los códigos ASCII.

Pongamos sólo algunos ejemplo.
Por ejemplo, los códigos para 0, @, A, Z, |, son:

ASCII 48: 0 --- 011 0000
ASCII 64: @ --- 100 0000
ASCII 65: A --- 100 0001
ASCII 90: Z --- 101 1010
ASCII 124: | --- 111 1100

Notemos que, si el código binario de un dígito \( \xi \) es \( b_3b_2b_1b_0 \) (donde \( b_i \) son los bits del dígito \( \xi \)),
entonces su código ASCII es \( 011b_3b_2b_1b_0 \).

Si una letra del alfabeto inglés es la \( n \)-ésima en orden alfabético, y \( n \) tiene en binario la representación b_4b_3b_2b_1b_0,
entonces el código ASCII de esa letra en mayúsculas es \( 10b_4b_3b_2b_1b_0 \),
y el código ASCII de esa misma letra, pero en minúsucuas, es \( 11b_4b_3b_2b_1b_0 \).

Se ve entonces que, para transforma de mayúscula a minúscula y viceversa, basta cambiar tan sólo el 6to dígito (contando de derecha a izquierda).



De nuevo, no conviene aprenderse esos números, ni esas reglas de codificación,
pues en los lenguajes de programación o en los sistemas de computación,
siempre podemos encontrarnos con sorpresas.

Que los estándares existan, no quiere decir que todo el mundo los siga.
Entonces siempre hay que estar atentos a cuál sistema de codificación se usa en tal o cual situación.

Lo ideal es que todo tienda a un único método uniformizado de codificación, pero por diversos motivos siempre hay obstáculos en este aspecto, y el código universal único jamás se logra del todo.

24 Febrero, 2013, 12:57 am
Respuesta #3

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Sistemas de codificación anteriores al ASCII

Desde el punto de vista histórico hubiera sido más lógico que comience desde más atrás en el tiempo, siguiera por el ASCII, que está más o menos en el medio de la línea histórica, siguiera con las sucesivas normas ISO 8859-X, y terminara con Unicode y su equivalente ISO/IEC 10646.

Pero no. Al código ASCII lo puse primero en la vidriera porque representa un punto de inflexión fundamental en la historia de la codificación de caracteres. Antes había varios sistemas distintos, hasta que llegó el ASCII y logró una estandarización uniforme, en una tabla de caracteres estrecha, pero útil (al menos para los estadounidenses).
El resto de países del mundo, con excepción de China y Japón, modificaron un poco el ASCII para adaptarlo a sus necesidades. Hubieron normas ISO que avalaron y/o definieron estas adaptaciones locales. Luego Japón se unión a la fiesta, con una codificación también basada en una forma extendida de ASCII, y finalmente China hizo lo propio, siguiendo posiblemente las pautas de Japón.

A continuación, basados en la norma ISO 8859-1, que es una de las basadas en ASCII, como ya dimos a entender; se extendió el juego de caracteres a un conjunto mucho mayor, el Unicode, con la intención de poner en un único conjunto a todos los caracteres de los lenguajes del mundo, incluido el chino, las variantes de India, y todo otro alfabeto exótico que hubiere por el mundo.

Luego surgió la norma ISO/IEC 10646 con la intención de definir un conjunto de 2000 millones de caracteres (de los cuales nadie usará más de la milésima parte en toda el tiempo que dure la humanidad), que unificó su alma con la de Unicode, y así seguirá por largo tiempo.

Como se ve, todo el mundo parece encaprichado en seguir el camino que se inició con ASCII.



En este post vamos a dar un paseo por las codificaciones anteriores o contemporáneas al ASCII,
un poco por curiosidad histórica, y otro tanto para discutir las razones de por qué se elige hacer una codificación de caracteres de una manera determinada, en vez de cualquier otra.

La bibliografía en que basaré estos comentarios será la siguiente:


[1] Fonts & Encodigns, Y. Haralambous.
[2] The Evolution of Character Codes, Eric Fisher.
[3] ASCII, Wikipedia.




En el año 350 A.C. en Grecia se empleó un sistema de codificación de las 24 letras griegas, que consistía en un sistema de antorchas de 2 x 5, puestas sobre dos muros, con el fin de transmitir información a larga distancia.
¿Por qué 2 grupos de 5 antorchar cada uno?
Creo que en el libro [1] hay un error al explicarlo, que no reproduciré para no confundir.
La explicación correcta parece ser la que se aprecia alrededor de los 4:44 minutos del siguiente video de Youtube:

Visual Telegraphs (Language of Coins: 5/12).

Las letras griegas se colocan en una tabla de 5x5, accediendo a ella con números del 1 al 5 en la entrada horizontal, y también del 1 al 5 en la entrada vertical.
El número de antorchas encendidas en el primer grupo (o muro) corresponde al número de acceso horizontal de la tabla, mientras que el número de antorchas encendidas en el segundo grupo da el número de acceso vertical de la tabla. Luego, buscando la intersección de la fila y columna dadas, se obtiene la letra deseada:

______12345
\( \textsf{A} \)\( \textsf{B} \)\( \Gamma \)\( \Delta \)\( \textsf{E} \)
\( \textsf{Z} \)\( \textsf{H} \)\( \Theta \)\( \textsf{I} \)\( \textsf{K} \)
\( \Lambda \)\( \textsf{M} \)\( \textsf{N} \)\( \Xi \)\( \textsf{O} \)
\( \Pi \)\( \textsf{P} \)\( \Sigma \)\( \textsf{T} \)\( \textsf{Y} \)
\( \Phi \)\( \textsf{X} \)\( \Psi \)\( \Omega \)

Para el detalle histórico de éste y otros métodos de comunicación de los antiguos griegos, ver por ejemplo:

Ancient Greek Communication Methods, M. Lahanas

Para codificar la dirección de esta web: RINCONMATEMATICO, aunque pasándolo fonéticamente a griego: PINKONMATEMATIKO, tendríamos que enviar el siguiente mensaje con las antorchas:

IIII    II
II      IIII
III     III
II      IIIII
III     IIIII
III     III
III     II
I       I
IIII    IIII
I       IIIII
III     II
I       I
IIII    IIII
II      IIII
II      IIIII
III     IIIII





En 1790, Francia, los hermanos Chappe idearon un sistema de comunicación telegráfico con dos relojes de péndulo, perfectamente sincronizados, puestos a unos 16 kilómetros de distancia.
Se ponían números del 0 al 9 en ese reloj, y cuando la aguja pasaba por el dígito que se deseaba transmitir como mensaje, se emitía un sonido. Codificando letras o palabras adecuadamente con esos números, se puede transmitir cualquier mensaje.

Sin embargo, me quedan serias dudas sobre la correcta sincronía de los mensajes, ya que con esa distancia, un sonido tarda cerca de 1 minuto en llegar.  :-\

Otra idea de Chappe fue elaborar un aparato de madera con 5 (¿6?) paneles deslizantes, que se abrían o cerraban con un sistema de poleas. Según que un panel estuviese "abierto" o "cerrado" (tal como un código binario 1 o 0), se podían formar hasta \( 2^5=32 \) combinaciones posibles de mensajes, suficientes para codificar cualquier letra del alfabeto fráncés.

Finalmente Chappe se decidió por un sistema con mejor "visibilidad", ideando un semáforo de vigas.  :o
Sobre una torre se colocan unas vigas que se hacen girar poniéndolas según distintos grados de inclinación.
La inclinación exacta de estas vigas es bien visible a largas distancias.
El sistema consta de 2 brazos, que pueden tomar cada uno 7 posiciones distintas, y una barra cruzada que une los brazos, y que puede tomar 4 ángulos diferentes (0º, 45º, -45º y 90º). Esto en total da 7 x 7 x 4 = 196 símbolos posibles a codificar. (Más que el ASCII ;) ).

Para más detalles, consultar estos enlaces:

http://people.seas.harvard.edu/~jones/cscie129/images/history/chappe.html
http://en.wikipedia.org/wiki/Semaphore_line
http://chappe.ec-lyon.fr/tcodes.html

Voy a piratear la imagen de Wikipedia para que se entienda la idea de la codificación:




Pasemos al código Morse (originado en 1837), que se aplicó para transmitir mensajes a través del telégrafo eléctrico.
En este código hay 3 elementos básicos que construyen los signos a transmitir: pitidos cortos, pitidos largos, y silencios.
Los silencios se usan para separar letras o palabras entre sí. Por lo tanto, la ensencia del código es binaria.
Si indicamos el pitido corto con un punto \( \bullet \) y el pitido largo con una raya \( \textsf{\bf ---}  \),
el código Morse establece estas correspondencias (pirateado de Wikipedia):


La 1er columna corresponde al código original patentando por Morse,
la 2da columna es una adaptación alemana,
y la 3er columna es la versión internacional ITU, actualmente aceptada.

El enlace de Wikipedia es éste:

http://en.wikipedia.org/wiki/Morse_code

El significado de los silencios o tiempos de espera, así como la duración de los pitidos cortos y largos, quedará mejor explicado si directamente copio lo que dice Wikipedia en español:

La duración del punto es la mínima posible. Una raya tiene una duración de aproximadamente tres veces la del punto. Entre cada par de símbolos de una misma letra existe una ausencia de señal con duración aproximada a la de un punto. Entre las letras de una misma palabra, la ausencia es de aproximadamente tres puntos. Para la separación de palabras transmitidas el tiempo es de aproximadamente tres veces el de la raya.

El código de pedido de socorro clásico, el S.O.S., se codifica como: \( \bullet\bullet \bullet\textsf{ --- --- --- }\bullet\bullet \bullet \).

Para indicar que ha habido un error, se envían seis letras E seguidas, en grupos de a dos: \( \bullet\bullet \qquad\bullet \bullet\qquad\bullet \bullet \).

A ver si aprenden el código Morse, que ahora no tienen excusas.  :P

En realidad el código Morse permite enviar no sólo letras y dígitos, sino también algunos signos de puntuación, letras acentuadas o modificadas de otros idiomas, y también unas señales especiales llamadas prosignos, que sirven para ordenar adecuadamente los parámetros de una comunicación.

Más adelante volveremos sobre esto, ya que el Morse es un código actualmente en uso,
aunque no tenga nada que ver con los sistemas de codificación de caracteres de una computadora.



En 1605, Bacon inventó un método de esteganografía (enviar un mensaje oculto dentro de un texto naturalmente escrito). Lo que hacía era escribir las letras A y B del mensaje secreto con un "tipo de letra" diferente.
Esas letras A y B, al limpiarlas del resto del texto basura, se consideran como nuestros modernos "bits" (A sería el 1 y B el 0), formando paquetes de a 5 (un código de 5 bits, que daría 32 posibles combinaciones).

Esto puede verse en el video de Youtube que enlacé más arriba, a partir del minuto 5:20.
También puede consultarse la siguiente página:

http://en.wikipedia.org/wiki/Bacon%27s_cipher

El código de Bacon es éste:


a   AAAAA   g     AABBA   n    ABBAA   t     BAABA
b   AAAAB   h     AABBB   o    ABBAB   u-v   BAABB
c   AAABA   i-j   ABAAA   p    ABBBA   w     BABAA
d   AAABB   k     ABAAB   q    ABBBB   x     BABAB
e   AABAA   l     ABABA   r    BAAAA   y     BABBA
f   AABAB   m     ABABB   s    BAAAB   z     BABBB




En 1870, Baudot inventó un código diferente para el telégrafo eléctrico, basado en el código de Bacon. El método de transmisión era a través de 5 teclas similares a las de un piano, que enviaban una señal a través de un cable.
Estaba diseñado con la intención de minimizar la fatiga del operador, quien usaba dos dedos de su mano izquierda y 3 dedos de su mano derecha, para presionar las teclas.

El código de Baudot fue el International Telegraph Alphabet No. 1 (ITA1).

En 1901, Murray modificó el código de Baudot, adaptándolo a un sistema de perforación de tarjetas.
Ahora el operador usaba un teclado que realizaba una perforación en unas cintas de papel, luego un aparato transmisor enviaba la información de la cinta perforado por telegrafía, y en el lado receptor, un mecanismo de impresión repetía la impresión de las perforaciones en otra cinta de papel.

Ahora el código de Murray se diseñó para minimizar el desgaste de las máquinas perforadoras. (Las letras más frecuentes usaban menos perforaciones).

Se utilizaban caracteres de control, como CR (retorno de carro) y LF (avance de línea), así como otros caracteres espaciales (NULL, DEL).

Luego la empresa Western Union adoptó el código de Murray, pero con algunos caracteres de control adicionales.

En 1930 se estableció el estándar International Telegraph Alphabet No. 2 (ITA2), que surgió como una pequeña modificación del sistema utilizado por Western Union.

Para más información, ver por ejemplo:

http://en.wikipedia.org/wiki/Baudot_code

Los códigos basados en el de Baudot, y posteriores, son todos binarios, de 5 bits (dígitos 0 y 1),
y nos interesan porque introducen algunas características que luego se han contagiado al ASCII,
como es el caso de los caracteres de control.

Las razones para la existencia de cada conjunto específico de caracteres de control se entienden mejor en su contexto, según el tipo de comunicación que debía establecerse, el aparato involucrado, el tipo de codificación, etc.

En un futuro post seguramente retomaremos estos códigos, para aprenderlos con más detalle.



En 1960 las fuerzas armadas de Estados Unidos adoptaron un código de 7 bits, llamado FIELDATA.
Contiene códigos para caracteres "normales" (letras, dígitos y signos de puntuación), y códigos de control para llevar a cabo correctamente las transmisiones de datos o las comunicaciones.

Ver, por ejemplo: http://en.wikipedia.org/wiki/Fieldata



En 1963 surgió una versión preliminar del código ASCII (de 7 bits), sin letras minúsculas,
y que ya tenía caracteres de control.

En 1964, la empresa IBM intentó introducir en el mundo el código EBCDIC, con una distribución de caracteres muy diferente a la de ASCII, y cuyas motivaciones son ante todo históricas, intentando preservar un método de codificación de datos censales en tarjetas perforadas, inventado por quien fue el creador de IBM (con otro nombre) en el siglo 19.

No tengo deseos de analizar en detalle la codificación EBCDIC.
Sin embargo, volveré con más detalles sobre las otras que se han mencionado en este post.

Mientras tanto, quienes tengan curiosidad, pueden visitar la siguiente página:

http://www.wps.com/projects/codes/index.html

24 Febrero, 2013, 05:45 pm
Respuesta #4

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Código Morse Internacional (ITU)

Vamos a estudiar el código Morse actualmente aceptado como estándar por la  International Telecommunication Union (ITU).

Si bien hay varios métodos para aprender Morse, no veremos ninguno de ellos.

El código Morse está compuesto por 5 elementos:

  • \( \bullet \): Es el "dit" o "pulso corto". Es un sonido cuya duración se toma como unidad de tiempo.
  • \( \textsf{---\ } \): Es el "dah" o "pulso largo". Es un sonido cuya duración es igual a 3 veces la de un "dit".
  • Salto intra-elemento: Es un silencio, cuya duración es de un "dit", y se intercala entre dos pulsos (ya sean cortos o largos).
  • Salto corto: Es un silencio, cuya duración es la de 3 "dits", e indica que se están separando dos letras.
  • Salto largo: Es un silencio, cuya duración es la de 7 "dits", e indica que se están separando dos palabras.

Es posible representar con un código binario a esos 5 elementos.
Supongamos que la presencia de cada bit 0 ó 1 indica la duración de un "dit", sin interrupciones.
Con el bit 1 indicamos "sonido" y con el bit 0 indicamos "silencio".
De esta manera, tendríamos las siguientes equivalencias:

  • 1:         \( \bullet \).
  • 111:     \( \textsf{\bf ---\ } \).
  • 0:         Salto intra-elemento..
  • 000:     Salto corto.
  • 0000000: Salto largo.


Nosotros vamos a representara a
los "dit" con \( \bullet \),
los "dah" con \( \textsf{\bf \ ---\ } \),
y los "silencios" con _ (aunque a veces los omitiremos, para mayor claridad).



Caracteres alfabéticos:

ABCDEFGHI
\( \bullet\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\bullet\bullet\bullet \)___\( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\bullet\bullet \)___\( \bullet \)___\( \bullet\bullet\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet \)___\( \bullet\bullet\bullet\bullet \)___\( \bullet\bullet \)___
JKLMNOPQR
\( \bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\bullet\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\bullet \)___
STUVWXYZ
\( \bullet\bullet\bullet \)___\( \textsf{\bf \ ---\ } \)___\( \bullet\bullet\textsf{\bf \ ---\ } \)___\( \bullet\bullet\bullet\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\bullet\bullet\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\bullet \)___

Caracteres numéricos:

01234
\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\(  \bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \bullet\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\(  \bullet\bullet\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\(  \bullet\bullet\bullet\bullet\textsf{\bf \ ---\ } \)___
56789
\( \bullet\bullet\bullet\bullet\bullet \)___\( \textsf{\bf \ ---\ }\bullet\bullet\bullet\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\bullet\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\bullet \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet \)___

Signos de puntuación:

.,:?'-/
\( \bullet\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\bullet\bullet \)___\( \bullet\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\bullet \)___\( \bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\bullet\bullet\bullet\bullet\textsf{\bf \ ---\ } \)___\( \textsf{\bf \ ---\ }\bullet\bullet\textsf{\bf \ ---\ }\bullet \)___
()"=+\( \times \)@
\( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\bullet\bullet\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\bullet\bullet\bullet\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\bullet \)___\( \textsf{\bf \ ---\ }\bullet\bullet\textsf{\bf \ ---\ } \)___\( \bullet\textsf{\bf \ ---\ }\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\bullet \)___

Signos de propósito general:

Podemos pensar estos casos como caracteres de control.

Los estandarizados son los siguientes:

  • Comprendido:              \( \bullet\bullet\bullet\textsf{\bf \ ---\ }\bullet \)
  • Error:                           \( \bullet\bullet\bullet\bullet\bullet\bullet\bullet\bullet \)
  • Invitación a transmitir: \( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)
  • Esperar:                       \( \bullet\textsf{\bf \ ---\ }\bullet\bullet\bullet \)
  • Fin del trabajo:             \( \bullet\bullet\bullet\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)
  • Iniciando señal:            \( \textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ }\bullet\textsf{\bf \ ---\ } \)

El último signo, iniciando señal, debe aparecer al comienzo de toda transmisión.

El estándar establece algunas reglas adicionales para enviar ciertos mensajes.
Por ejemplo, si ciertos caracteres son viables en un telegrama, que no figuran en el código Morse, pueden enviarse con Morse, siguiendo estas normas:

* Para el signo de multiplicación, enviar una X.

Esa regla me parece algo ambigua, dado que ya hay un signo estándar de multiplicación en la lista que vimos antes.  ???

* El signo de porcentaje % se envía como la secuencia de caracteres 0 / 0.

* El signo de "por mil" %0, se envía como la secuencia de caracteres 0 / 0 0.

* Para transmitir números seguidos de una fracción y/o de signos de porcentaje o "por mil", separar por guiones. Por ejemplo, \( 4\frac12\% \) se envía con la secuencia de caracteres 4 - 1 / 2 - 0 / 0.

* El caracter de doble comilla sirve tanto para indicar las "comillas que abren" como las "comillas que cierran".

* Se puede usar un doble apóstrofe para indicar "dobles comillas".

* Para indicar minutos y segundos (como en latitud 25º44'17'' W), se debe usar 1 apóstrofe para "minutos" y 2 apóstrofes para "segundos", pero no está permitido usar el caracter de dobles comillas para "segundos".



Hay en uso varios prosignos, que tienen el rol de caracteres de control, así como de abreviaturas en Morse.

No parece que estos prosignos estén considerados en el estándar, pero quizás no estoy bien informado.

Las normas para una comunicación en Morse son las siguientes:

* Toda comunicación debe comenzar con la señal de llamada enviando el código de llamada para la estación conque se desea comunicar. No se debe repetir más de 2 veces.

Cuando se envía un llamado a "cualquier estación" (calling anyone), se utiliza la abreviatura CQ.
Esto es especialmente útil en llamados en los que se pide ayuda, o se dan mensajes de advertencia.

* Luego del nombre de la estación, se envián enseguida la palabra DE, y a continuación el código de identificación de nuestra estación propia (o sea, la estación que llama), y termina con el signo "Invitación a transmitir".

* La estación que está siendo llamada (por "nosotros"), debe responder inmediatamente transmitiendo la señal de la estación que le llama (la "nuestra"), la palabra DE, seguida por su propia señal, y terminando con el signo "Invitación a transmitir".

Es importante observar aquí que DE es una "palabra", que no es lo mismo que decir que son dos caracteres sueltos, o algo diferente. Esto nos indica que antes y después de DE debe haber un "salto largo" (un silencio de 7 dits).

* Si la estación que recibe el llamado no está apta para recepción en ese momento (ya sea porque le anda mal el aparato, o porque están conversando con alguien más, etc.), deben enviar una señal de "esperar".

* Si la espera será mayor a 10 minutos, debe darse una razón para ello, y además indicar cuánto tiempo durará la espera.

* Cuando la estación que hemos llamado no responde nuestros repetidas llamadas, debemos revisar el estado de nuestros aparatos.

* El signo "doble guión" (=) debe transmitirse para separar:

El preámbulo, de las indicaciones del servicio;
las indicaciones del servicio, de cada uno de los otros (¿servicios?);
las indicaciones del servicio, de una dirección;
la estación del destinatario, del texto;
el texto, de la firma.

 ??? ??? ???

* Una vez iniciada una transmisión, no puede interrumpirse, ni siquiera para dar una comunicación de más alta prioridad, excepto en el caso de una urgencia absoluta.

* Todo telegrama debe terminar transmitiendo la señal del caracter "+".

* El fin de la transmisión se indicará con el signo "+" seguido de la señal de "invitación a transmitir".

* El fin del trabajo será indicado por la estación que envíe el último telegrama. El modo correcto de hacerlo será con la señal de "fin del trabajo".



Observemos que los caracteres misceláneos son, en realidad, prosignos dados por el estándar.

Tenemos, pues que:

  • \( \overline{\textsf{SN}} \): Comprendido.
  • \( \overline{\textsf{K}} \): Invitación a transmitir.
  • \( \overline{\textsf{AS}} \): Esperar.
  • \( \overline{\textsf{SK}} \): Fin del trabajo.
  • \( \overline{\textsf{CT}} \): Iniciando señal.

La señal de socorro no aparece en el estándar, pero debiera.
Se trata del prosigno \( \overline{\textsf{SOS}} \), que significa "Save Our Souls" (salven nuestras almas  :'( :'( :'( :'( :'( :'( :'( ).

  • \( \overline{\textsf{SOS}} \): Sálvennos.

La señal de error podría considerarse como el prosigno \( \overline{\textsf{EEEEEEEE}} \), pero en realidad se la toma como una palabra compuesta por 8 letras E.



La diferencia entre un prosigno y una abreviatura es que un prosigno no tiene "saltos inter-caracter" entre los caracteres que lo forman, dando lugar a una ligadura.

Cada prosigno debe considerarse como un nuevo signo del código Morse,
y el hecho de que se forma con 1 o más caracteres ligados, sólo sirve para que sea fácil de recordar (detalle mnemotécnico).

No obstante, todo prosigno se forma de esta manera, es decir, por medio de ligaduras de los signos principales.

Por otro lado, una abreviatura debe respetar el "salto corto" entre las letras que la forman. Una abreviatura se toma como una "palabra".

Si bien el estándar da las recomendaciones básicas y suficientes para que nos comuniquemos con el código Morse,
esto puede no sea del todo satisfactorio para aquellos que quieran tener una comunicación completa con otros radioaficionados.

Para ello, es conveniente tener a mano listas de prosignos y abreviaturas de uso común entre usuarios del código Morse, aunque no estén estandarizadas.
No entraré en detalles, pero se pueden consultar por ejemplo en Wikipedia:

http://en.wikipedia.org/wiki/Prosigns_for_Morse_code
http://en.wikipedia.org/wiki/Morse_code_abbreviations

Aquí hay más información:

http://10fi.multiply.com/journal/item/8

Los prosignos y abreviaturas allí indicadas son de uso internacional, y sirven para comunicarse bastante bien con personas que hablan otros idiomas, sin necesidad de traducción alguna.

Cuando la conversación se vuelve más compleja, se suele recurrir a una lingua franca, como lo sería el inglés.



Podemos observar que no existe el signo de exclamación ! en la versión oficial del código Morse.

Yo adjudico esto al hecho obvio de que todos los usuarios de Morse son muy entusiastas.
Por lo tanto, el signo de exclamación ! está en toda comunicación en Morse, por defecto. No hace falta escribirlo.  :P



Más importante me parece la discusión (que casi no habrá aquí) acerca de las transmisiones en idiomas que cada vez se van alejando más y más del inglés.
Se hacen necesarios códigos para caracteres especiales, nuevas letras, acentos diacríticos, etc.

Para esto, cada nación, o conjunto de naciones, tiene que especificar unas normas tales que todo el mundo comparta. Esta uniformidad es importante por la necesidad misma que tenemos de que el código realmente sirva para comunicarnos, antes que para confundirnos.

En la página de Wikipedia se pueden ver algunos caracteres especiales para otros idiomas. (Non-english extensions).

http://en.wikipedia.org/wiki/Morse_code

Pero hay idiomas que ya difieren tanto de los lenguajes occidentales que requieren reformular todo el código. Podemos echar una ojeada aquí:

http://en.wikipedia.org/wiki/Other_alphabets_in_Morse_code

Más complicada es la situación de los lenguajes del lejano oriente,
en que se llevan a cabo diversas estrategias.
Los chinos asignan unos números a sus ideogramas, y luego son esos números los que transmiten por Morse.
Los coreanos hacen un mapeo de sus caracteres gráficos al alfabeto latino,
aunque este mapeo no tiene ninguna interpretación lingüística concreta, sino que los usan igual que los chinos usan números.

Detalles podremos visualizar aquí:

http://en.wikipedia.org/wiki/Wabun_code
http://en.wikipedia.org/wiki/Chinese_telegraph_code
http://en.wikipedia.org/wiki/SKATS



Retomemos el tema de los prosignos.

Se ve en las normas de ITU que el código Morse no es solo un mapeo de caracteres a una listita de señales (más o menos en binario), sino que hay también un protocolo de comunicación.

Para entender este protocolo, tenemos que imbuirnos en la realidad tecnológico en que el código Morse "vive".

El Morse puede emitirse no sólo como sonidos a través de un telégrafo, sino también a través de sonidos emitidos por estaciones radiodifusoras, así como encendidos y apagados de aparatos de radio, y hasta como señales visuales a través de faros o lámparas.

También se puede transcribir el código Morse como puntos, rayas y espacios, como hacemos nosotros aquí en este hilo.

En el caso del telégrafo, el medio de transmisión es un cable eléctrico.
En el caso de las estaciones radiodifusoras, el medio de transmisión es "el aire" que rodea la superficie terrestre, o mejor dicho, la "atmósfera", por donde las señales de radio circulan, llegando a todos los rincones de la Tierra.
En el caso de los faros, el medio de transmisión también es el aire, claro está, aunque puede ser cualquier medio que transmita en forma clara las señales lumínicas.

Más importante que el medio de transmisión es definir el universo de "posibles receptores".

Como prácticamente cualquiera puede transmitir, así como oír lo que otros transmiten,
es necesario indicar quién llama y a quién se dirige.


* 1ero: Hay un emisor que hace una llamada a un receptor. El inicio de la llamada debe contener la identificación del emisor y el receptor. Además, debe respetarse un formato específico.

* 2do: El receptor está obligado a responder, también dando las identificaciones propias, así como el eco de la identificación de la estación emisora.

* 3ro: En caso de no poder cumplir la obligación de responder, es obligatorio poner una señal de "espere", e incluso también informar de las razones de la espera.

* 4to: No se debe interrumpir la comunicación.

* 5to: El fin de la transmisión debe indicarse con los códigos adecuados, y quedar a la espera de respuesta.

* 6to: El fin de toda la comunicación también debe indicarse con los códigos correctos.

Observemos que hay bastante de "voluntad humana" en el respeto a las reglas de comunicación en Morse.
En todos los casos, se utilizan prosignos para marcar los debidos protocolos que indican que se inicia la transmisión, que se enviará información, que se deja de enviar información, que se esperan datos, que la comunicación se interrumpe temporalmente, que hay un error en los datos enviados, y finalmente que la transmisión ha terminado.

Pero estos protocolos se respetan sólo por la buena fe de los radioaficionados, pues no son señales automáticas enviadas por una computadora (aunque en realidad esto es factible de hacer).

No obstante, sirven para que entendamos más adelante otros protocolos de transmisión de información más automáticos.



He incluido 2 archivos con el estándar ITU para código Morse.
El primero está más actualizado, pero incompleto.
El segundo está completo, pero es un poco más viejo.

Allí pueden estudiarse otras reglas que se agregan al protocolo de comunicación del código Morse.
En particular, cómo se manejan aquellas situaciones en que ha habido errores en la transmisión o en la recepción,
y cómo se corrigen esos errores.

24 Febrero, 2013, 10:42 pm
Respuesta #5

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Código ITA2 ("Baudot")

El código ITA2 es el estándar internacional que ha heredado las características del que fuera originalmente el código de Baudot.
No se le puede llamar "de Baudot" a este código, aunque mucha gente lo hace.
Es usado en (radio)telegrafía, y aquí explicamos cómo se implementa.

El sistema de Baudot usaba un aparato con 5 teclas, que generaban el bit "1" (si estaban presionadas) de un caracter determinado.
Para que todo funcione bien, los caracteres debían transmitirse con un ritmo preciso (cadencia).
Del lado del receptor solía colocarse un sistema de impresión de cintas de papel.
La cinta tenía 5 filas por cada columna, y en cada una de ellas, se perforaban las filas correspondientes a los "bits" recibidos.

Luego Murray utilizó un teclado más parecido al de una máquina de escribir, el cual producía perforaciones en cintas de papel, y estas cintas perforadas eran leídas por un mecanismo para ser transmitidas a un receptor.
Este mecanismo tenía la falla de que no era del todo automático, porque algunas operaciones de "impresión" tenían que realizarse manualmente. Por ejemplo, al llegar a un final de línea, se debía "retornar el carro de impresión" y "avanzar a la línea siguiente".
Finalmente esto fue automatizado por Murray, enviando caracteres de control para esos fines especiales.

En la década de 1920 se iniciaron los intentos de estandarización del código de Baudot (o similares).
La delegación de cada país puso sobre el tapete los problemas que cada uno tenía con estos códigos telegráficos de 5 bits.
Algunos países reclamaban que se consideren letras con acentos,
la Unión Soviética reclamaba un sistema que tenga en cuenta la complejidad del alfabeto cirílico.

A fin de representar la mayor cantidad de información, con la menor cantidad posible de bits,
se usó siempre la técnica de "cambiar de caso" (en inglés es "case", pero sospecho que lo traduje mal, o que no hay una traducción apropiada).
Por ejemplo, se usaban códigos (con sus correspondientes teclas) para cambiar a mayúsculas, minúsculas y "figuras" (dígitos y otros símbolos).
Los rusos reclamaban la necesidad de 5 de estos "cambios de casos".
Este tipo de "cambios" se realizarían con códigos y teclas del tipo "SHIFT" (cambiar, alternar).

Se discutió la posibilidad de agregar un 6to bit, para solucionar algunos de estos problemas, pero la propuesta se rechazó.
Las discusiones siguieron durante todo el siglo 20.

Contamos toda esta historia aquí, para que tengamos fresca la cuestión de que estas discusiones sobre cómo codificar caracteres contienen problemas que surgen una y otra vez, desde hace décadas. Son temas recurrentes.

Las máquinas típicamente utilizadas para transmitir información con estos códigos son los teletipos.
El aparato que recibe el mensaje transmitido, puede imprimirlo en tarjetas perforadas, o bien al estilo de una impresora de matriz de puntos. En ese caso se vuelven fundamentales los caracteres de control.



En 1931, los ITA1 e ITA2 (International Telegraphic Alphabet 1 y 2) fueron creados, pero sólo el último fue finalmente usado.
Es un código binario de 5 bits. Originalmente se indicaba con un círculo a las "marcas" y con un punto a los "huecos".
En las tarjetas perforadas, las "marcas" corresponden a "perforación" y los "huecos" a "nada".
Nosotros usaremos bits 1 y 0 para marcas y huecos respectivamente.

Más aún, la transmisión de este código y otros similares, se hace con los bits en orden inverso.
Esto explica cómo el código 11000 representa la sucesión de marcas y huecos: \( \cdot \cdot \cdot{} \circ  \circ  \).
La tabla ITA2 es como sigue:

Binario--Transmisión--Letra--Figura
00011OO...A-
11001O..OOB?
01110.OOO.C:
01001O..O.D[ENQ]
00001O....E3
01101O.OO.F{nacional}
11010.O.OOG{nacional}
10100..O.OH{nacional}
00110.OO..I8
01011OO.O.J[BEL]
01111OOOO.K(
10010.O..OL)
11100..OOOM.
01100..OO.N,
11000...OOO9
10110.OO.OP0
10111OOO.OQ1
01010.O.O.R4
00101O.O..S'
10000....OT5
00111OOO..U7
11110.OOOOV=
10011OO..OW2
11101O.OOOX/
10101O.O.OY6
10001O...OZ+
01000...O.[CR]
00010.O...[LF]
11111OOOOO[LTRS]
11011OO.OO[FIGS]
00100..O..[SP]
00000.....[NUL] ó {no usado}

He usado corchetes para indicar caracteres de control.

[ENQ] Pregunta la identidad del emisor del mensaje (ENQuiry = Who aRe yoU?).
[BEL] Emite un sonido de aviso o campana, en el dispositivo receptor (BELl).

[CR] significa que el dispositivo de impresión debe realizar un retorno del carro de impresión (Carriage Return).
[LF] indica que el dispositivo de impresión debe avanzar a la siguiente línea (Line Feed).
[LTRS] quiere decir que, a partir de ese momento, todos los caracteres que vienen a continuación corresponden a los indicados en la columna "letras" en la tabla de codificación. (LeTteR Shift).
[FIGS] quiere decir que, a partir de ese momento, todos los caracteres que vienen a continuación corresponden a los indicados en la columna "figuras" en la tabla de codificación. (FIGure Shift).
[SP] denota un espacio en blanco (SPace).

Lo que hacen [LTRS] y [FIGS] es "alternar modos", seleccionando el modo "letras" en el primer caso, y el modo "figuras" en el segundo caso.

Los caracteres de control [CR], [LF], [LTRS], [FIGS], [SP], son accesibles en cualquiera de los dos "modos" (modo "letras" o modo "figuras").

Las 3 posiciones que dicen {nacional}, indican que esos lugares se reservan para uso definido según las necesidades de cada país.
Si bien no es posible codificar todas las letras acentuadas, una a una, en cambio es factible poner allí acentos diacríticos aislados, que en combinación con otro caracter, pueden generar un aviso en el receptor de que debe "interpretarse" que una letra tiene algún tipo de acento.
Esto, sin embargo, no es suficiente para alfabetos complicados (ya al cirílico lo veo en problemas).
Para los idiomas del lejano oriente, esos 3 espacios son absolutamente tacaños>:(

La posición que indica [NUL] ó {no usado}, es un caracter nulo. No realiza acción alguna.
A veces los aparatos reciben ese caracter nulo por defecto durante un tiempo, y no imprimen nada mientras esperan otros datos.
Es importante, por lo tanto, dejar ese caracter nulo "sin uso alguno", para permitir esos largos ratos de "información en blanco" que a veces se necesita en la telegrafía.
Acerca de esto, voy a copiar un párrafo de Wikipedia, extraído del siguiente enlace:

http://en.wikipedia.org/wiki/Teleprinter

When the line is broken, the continuous spacing (open circuit, no current flowing) causes a receiving teleprinter to cycle continuously, even in the absence of stop bits. It prints nothing because the characters received are all zeros,



La ventaja de ITA2 sobre Morse internacional, es que la longitud en bits de los caracteres es fija (5 bits).
Dos desventajas importantes son: (1) la escasez de espacio para enviar códigos en otros idiomas, (2) el modo ilógico en que los caracteres se han ordenado en la tabla.
Esto último es consecuencia del deseo de hacer el código más eficiente (letras más usadas se transmiten con códigos que tienen menos "perforaciones", o sea, menos bits 1).

Sin embargo, en las mismas décadas (1930 en adelante) en que se discutía si mejorar o no el estándar ITA2,
también se estaban desarrollando las tecnologías de la computación, y se usaban teletipos en combinación con equipo informático.
Los programadores necesitaban un alfabeto binario, pero distinto al ITA2, en el cual la distribución de los caracteres tuviera un ordenamiento más "lógico", pensando ahora en las necesidades de los programas de computadoras.
Por ejemplo, los códigos binarios de las letras tendrían que ir en orden secuencial, y lo mismo para los códigos de los dígitos.



Este alfabeto ha sido importante, debido a que el uso de teletipos ha tenido importantes aplicaciones en las fuerzas armadas, la prensa, el correo, etc., incluso hasta épocas tan recientes como la década de 1980.

O sea que históricamente está algo superpuesto con el ASCII, aún cuando el origen de ITA2 es anterior.

03 Marzo, 2013, 06:35 am
Respuesta #6

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
FIELDATA

En la década de 1950 las Fuerzas Armadas de Estados Unidos desarrollaron un proyecto informático que se utilizaría para la transmisión de información de las operaciones militares. El proyecto involucró la instalación de computadoras en diversas instalaciones que se comunicarían entre sí.
Para ello se diseñó un código binario para representar información de un modo estandarizado.
Al parecer, tanto el proyecto como el código se llamaron ambos FIELDATA.

Se trata de un código que usa 7 bits (0 y 1), dando un total de 128 caracteres representados.
Algunos de ellos son, como siempre, caracteres de control.
Nuestro interés en FIELDATA está en conocer código que más o menos fue precursor del ASCII,
y a mí en particular me interesa exhibir los caracteres de control.

No voy a investigar los detalles del equipamiento utilizado por los militares yanquis en la década de 1950,
sino que sólo me voy a limitar a "más o menos imaginar" las necesidades que tenían esos equipos informáticos de tener un protocolo de comunicación y de transmisión de datos, que a su vez explica la existencia de caracteres de control en la tabla de códigos definidos en FIELDATA, que reflejan ese tipo de cosas.

En la 1er columna ponemos el código binario de 7 bits,
en la 2da columna está el correspondiente valor decimal,
en la 3er columna indicamos el caracter tal como se vería si fuera a imprimirse,
y en la 4ta columna agregamos algunos comentarios adicionales, que complementan el significado del caracter.
No he puesto la 3er columna para los caracteres con códigos del 96 al 127, porque son todos ellos caracteres de control.

He tenido que adjuntar la tabla como una imagen, ya que en el foro no puedo generar directamente el caracter 62.
(A medida que nuestro estudio de las tablas de caracteres se vaya complejizando, tendré que recurrir a esta manera de presentarlas, ya que no todos los paquetes de \( \LaTeX \) están instalados en el foro).



Observemos el caracter 62, que no está en la tabla ASCII que conocemos.
Es el caracter que se usa para indicar una moneda de cualquier nación, reemplazando al signo $.
Sin embargo, la verdad es que ese caracter nadie lo usa.

El primer caracter es un @, e indica o marca un espacio en blanco especial.
Posiblemente cumpla la función de un caracter nulo, como en el código de Baudot.
Pero la verdad no lo sé.

Observemos finalmente todos los caracteres de control, usados para controlar paquetes de información, confirmar que el envío está correcto, o que se recibió la información. Los caracteres "Dial 0" a "Dial 9" parecen corresponder a algún discado telefónico.

Ha habido varias versiones de este conjunto de caracteres.
Hay caracteres que se comportan diferente, según las versiones.
Por ejemplo, los primeros caracteres, que se ven como "imprimibles" en la tabla anterior,
en un principio se usaban como caracteres de control para enviar señales de "Retorno de Carro" y "Avance de Línea", o cosas por el estilo, a las impresoras enganchadas a los teletipos (teleimpresoras).

Esto lo cuento para que no se crean que esos caracteres de control "clásicos" no estaban en ninguna parte.

Las computadoras UNIVAC 1100 usaban la codificación de caracteres FIELDATA.
En la actualidad existen aún algunos equipos que la siguen usando, aunque en su mayoría han migrado oportunamente a ASCII.

Algunos datos adicionales pueden verse en:

http://www.wps.com/projects/codes/FIELDATA/index.html
http://www.fourmilab.ch/documents/univac/fieldata.html

03 Marzo, 2013, 05:16 pm
Respuesta #7

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
BCD, EBCDIC, otros

Cada sistema de cómputo, cada nuevo diseño de computadoras o de sistema de comunicaciones, lleva consigo un método por el cual representa la información, y en el mismo código se colocan caracteres usados en el protocolo mismo de la transmisión de esa información.
Juntar ambas cosas puede ser tema de debate, pero no estoy particularmente interesado en esto, sino en entender las cosas tal como vienen, y no en cómo "deberían ser".

La representación en binario de cantidades fraccionarias da lugar a errores de aproximación insalvables, cuando se intenta convertir de decimal a binario por ejemplo. Esto es inaceptable en algunos casos, y para ello se usan diversas estrategias de empaquetamiento de información numérica en base decimal.
A veces se busca a propósito que las cosas "más o menos encajen" entre las bases binaria y decimal, lo que se ve en la tabla de caracteres de EBCDIC, por dar un ejemplo.

Los códigos BCD son tablas de caracteres de 6 bits.
Estos códigos, así como el EBCDIC, están relacionados, ya sea prácticamente o históricamente,
a la representación de datos en tarjetas perforadas.
Ya hemos discutido más o menos este tema cuando hablamos del código de Baudot.

No siento que valga la pena entrar en demasiados detalles de todo esto,
pero dejo aquí una corta mención, por las dudas luego se me ocurra que haya que profundizar más.

Me limitaré a listar enlaces de Wikipedia, para quienes deseen curiosear:

http://en.wikipedia.org/wiki/BCD_(6-bit)
http://en.wikipedia.org/wiki/EBCDIC
http://en.wikipedia.org/wiki/Binary-coded_decimal


30 Junio, 2013, 04:19 am
Respuesta #8

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Variantes locales de ASCII

En la década de 1970 hubieron variantes de ASCII adaptadas a cada idioma, estandarizadas en las normas ISO646-XX, donde XX denota la variante adoptada por cada nación o idioma.
El principal inconveniente en esto reside en que se modifican algunos caracteres de la tabla ASCII original de 7 bits, dando lugar enseguida a incompatibilidades en la transmisión de información entre países de idiomas distintos.

Por ejemplo, un programa escrito bajo la norma ASCII alemana tiene un aspecto a veces irreconocible, debido a la sustitución de símbolos. Así, algo como: {*argv[1]='\0'}, tendrá el aspecto siguiente: æ*argvÆ1Å='Ø0'å.

El meollo del asunto aquí es que para la computadora, todo lo que hay son bits 0 y 1, mientras que al imprimir un caracter, se reemplaza una secuencia de 7 bits por un símbolo gráfico específico.
La designación de estos símbolos es una convención de un determinado grupo social. Si se intenta pasar información de un país a otro, pero en cada país cada quien defiende sus necesidades y caprichos, pronto veremos que será imposible entendernos.

Es mejor optar por un método de codificación de caracteres que tenga un núcleo común universal, y que permita variantes locales, previo aviso. ¿Y cómo se "avisa"? Bueno, en alguna parte de los archivos de texto o páginas web hay que indicar cuál es el método de codificación empleado. El nombre de esta codificación tiene que estar escrito mediante caracteres que sean universalmente aceptados, que si no, es el cuento de nunca acabar.



Antes de toda estandarización, las diversas empresas involucradas en la industria informática se tomaron el atrevimiento de definir las cosas a su antojo. Dado que tengo acceso a DOS/Windows, y que la mayoría de nosotros tenemos acceso a sistemas basados en DOS/Windows, ejemplificaré con dichos sistemas.

En el viejo sistema operativo DOS se fueron improvisando tablas de codificación de caracteres, adaptadas a las necesidades de cada país. Dichas tablas podían (y aún pueden) seleccionarse mediante el comando CHCP en linea de comandos.

Dicho comando significa "Change Code Page", es decir, "Cambiar Página de Códigos".
Aparentemente, se pensaba en los códigos de caracteres como agrupados en una cierta "página", que no sería otra cosa que una tabla que asigna a cada número entre 128 y 255 un símbolo específico.
Esto explica que la nomenclatura de cada tabla vaya precedida por CP, seguida de un misterioso número.

Veamos las páginas de códigos actualmente en uso en Windows, clasificadas según su origen histórico:

El panorama es muy complejo, y requiere un análisis detallado.
Actualmente hay aplicaciones y archivos configurados según esas páginas de códigos, y se necesita que sean traducidos a formatos Unicode de 1, 2 o más bytes.

Esto nos dice algo importante: estamos en medio de una etapa de transición en la historia de la codificación de caracteres.



La lista de todos los valores aceptados por el comando CHCP se pueden consultar en:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

Como esta página puede ir cambiando con el tiempo, guardaré una versión en un archivo adjunto HTML:

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

Más todavía, pongo unas imágenes a continuación con la lista, y así luego pasamos a comentar los detalles:





30 Junio, 2013, 04:50 pm
Respuesta #9

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Páginas de Códigos de IBM/MS-DOS/Windows

Hay varias complicaciones en torno a todas las codificaciones listadas en el post anterior, y eso que ni siquiera hemos mirado las tablas con los caracteres de cada una de ellas.
Una de esas complicaciones es que el mismo código binario significa un cierto caracter en una tabla, mientras que en otra tabla significa otro caracter.
Esto, obviamente, impide el intercambio de información entre países o idiomas diferentes.
Más aún, si en un mismo documento convive información de varios lenguajes distintos se hace necesario indicar de alguna manera los cambios de páginas de códigos.



He aquí una página que da acceso a la mayoría de las codificaciones conocidas o en uso.
A veces la misma codificación tiene un nombre o número distinto según quién sea el proveedor o fabricante.
Tratemos de no dejarnos confundir por eso.

http://www.i18nguy.com/unicode/codepages.html#msftdbcs

Es esa una buena web, pero no siempre hallaremos la información del todo completa que desearíamos.
Así que paciencia.
Yo trataré de rellenar algunos (pocos) agujeros que pueda haber.



Notemos la aparición de las páginas de códigos en que aparece IBM EBCDIC.
Todas ellas (o casi) corresponden a códigos de 1 byte de 8 bits.
Hemos visto en posts anteriores una tabla de IBM EBCDIC, que es la estándar para el inglés de Estados Unidos.
Hay luego adaptaciones o cambios para otros idiomas, y es entonces que han surgido dichas tablas.

La página de códigos original de IBM EBCDIC, que sirve para Estados Unidos y Canadá, es la que tiene número 037.
Las adaptaciones a otros idiomas son: 500 (EBCDIC internacional), 870 (multilingüe), 875, 1026, 1047, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 20273, 20277, 20278, 20280, 20284, 20285, 20290, 20297, 20420, 20423, 20424, 20833, 20838, 20871, 20880, 20905, 20924, 21025, 50930, 50931, 50933, 50935, 50936, 50937, 50939.

Si nos fijamos en la tabla del post anterior, veremos que cada una de estas páginas de códigos se refiere a un alfabeto distinto, y esto nos da la pauta de que el "estilo" de codificación EBCDIC ha sido importante en muchos sistemas de computación a lo largo del mundo, porque de otro modo nadie se hubiera tomado el trabajo de diseñar tablas de caracteres para tantos idiomas distintos si es que no se iban a usar.
O sea que, a pesar de lo desagradable que me resulta todo lo referido a EBCDIC, no queda más remedio que aceptar que esa manera de codificar caracteres existió, y se usó ampliamente en los sistemas informáticos en la 2da mitad del siglo 20.

Más aún, si hurgamos profundo, veremos que aún hoy hay algunos sistemas que todavía utilizan EBCDIC y sus variantes.
Esto puede tener su explicación en el hecho de que migrar a ASCII-UNICODE implicaría realizar cambios muy costosos en los equipos de algunas empresas.
Por otra parte, no es difícil imaginar cómo sería posible traducir de EBCDIC a ASCII y viceversa, siempre y cuando se tenga en cuenta que no todos los caracteres de una están en la otra.
El súperconjunto que contiene a todos los caracteres posibles en la actualidad es UNICODE. Traduciendo cualquier tabla de caracteres o página de códigos a UNICODE, garantizará que no haya pérdida de información, y también garantiza el paso a un formato universal y uniforme.

Por otra parte, pareciera que EBCDIC y sus variantes no son más que un capricho de IBM, intentando competir con ASCII y porfiando por imponer como estándar su propio sistema de codificación.
Dado que EBCDIC está adaptado a las antiquísimas y odiosas tarjetas perforadas, y como no siempre el "siguiente" de un caracter es el que uno esperaría, si es que seguimos el orden alfabético, es claro que EBCDIC estuvo siempre condenado al desuso.
No es que ASCII sea gran cosa, pero tiene la agradable virtud de que los dígitos tienen códigos numéricos consecutivos, y lo mismo pasa con las letras del alfabeto. Esto facilita mucho las tareas y la eficiencia de los sistemas de cómputo que han de crear los programadores.

Podemos echar un vistazo a los sistemas de cofidicación desde el punto de vista de la empresa IBM, que asocia números diferentes a las mismas tablas.
Agrego esta información porque en la página web siguiente se puede ingresar a las tablas y ver los caracteres individualmente:

http://publib.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/QB3AQ501/F.0

En la siguiente página se puede jugar con algunas tablas de EBCDIC, compararlas y demás:

http://home.mnet-online.de/wzwz.de/temp/ebcdic/cc_es.htm

La pregunta que me hago es si EBCDIC admite variantes con caracteres de longitud doble.
Me ha resultado difícil hallar información, salvo algunos retazos oscurso en Wikiipedia.
Al parecer, hay lenguajes que usan versiones doble byte de EBCDIC, y tenemos el caso de JEF (Japanese processing Extended Feature) y KEIS (Kanji processing Extended Information System), ambos para escritura japonesa. Ver:

http://en.wikipedia.org/wiki/JEF_codepage
http://en.wikipedia.org/wiki/KEIS

Estos dos últimos contienen caracteres de control que permiten alternar entre "single byte" y "double byte",
es decir, alternar en modos en los que hay caracteres expresables con la parte principal de la tabla, y que se indican con 1 solo byte, o bien el modo de caracteres que requieren 2 bytes para ser expresados.

Esta manera de representar caracteres es común en las codificaciones multibyte, pero no la analizaremos para EBCDIC, sino que retomaremos el análisis pertinente cuando pasemos por ASCII y sus amigos.



Vamos ahora a las extensiones de ASCII, comunmente denominadas OEM por Windows.
Los números de página de códigos que son extensiones de ASCII, y que surgieron antes de las estandarizaciones ISO, son los siguientes:

437, 667, 720, 737, 775, 790, 819, 850, 852, 855, 857, 858, 860, 861, 862, 863, 864, 865, 866, 867, 869, 872, 879, 895, 932, 936, 949, 950, 991, y otros sin número como: Kamenický encoding, Mazovia encoding, MIK code page.

Las páginas de código que aparecen en cursiva, y las que no tienen número, son extraños ejemplos que aparecen en Wikipedia:

http://en.wikipedia.org/wiki/Category:DOS_code_pages

Son ellos casos de codificaciones que han sido utilizadas probablemente en lugares muy específicos del planeta, y que han durado poco tiempo. No obstante, en algunos casos puede que haya software con esas codificaciones antiguas y maltrechas, y que aún sobreviva.

En todos los casos, los primeros 128 caracteres de la tabla son idénticos a ASCII.
Así que basta exhibir la 2da parte de la tabla, con los caracteres del 128 al 255.
Mostremos algunos ejemplos:

437: OEM IBM (inglés Estados Unidos)



850: OEM Latin 1



862: OEM Hebreo



866: OEM Ruso



Estas tablas tienen en común, como ya dijimos, los primeros 128 caracteres, siendo siempre una extensión de ASCII.
Pero los caracteres 128 a 255 se superponen entre las distintas codificaciones, poniendo obstáculos a la ¿maravillosa? globalización.

La mayoría de las tablas nombradas contienen caracteres codificados en 1 byte, y es que eso es suficiente en la mayoría de los lenguajes.
Pero para algunos lenguajes orientales, típicamente el Chino, 1 byte no es suficiente, y se necesitan codificaciones multibyte.
En la siguiente web podemos ver una lista (reducida) de las codificaciones DOS/Windows más utilizadas, y en la parte inferior se ven páginas de códigos "double byte", es decir, tales que se usan 2 bytes para cada caracter:

http://msdn.microsoft.com/en-us/goglobal/bb964654

932 (Japanese Shift-JIS)
936 (Simplified Chinese GBK)
949 (Korean)
950 (Traditional Chinese Big5)

Vayamos por ejemplo a la tabla de Chino simplificado:

http://msdn.microsoft.com/en-us/goglobal/cc305153



Los caracteres de la 2da parte de la tabla están en gris, indicando que son sólo la parte principal que accede a una subtabla de caracteres.
Si hacemos clic en uno de ellos (por ejemplo 8A) veremos cómo se accede a una subtabla en donde figuran los caracteres chinos de carne y hueso:

http://msdn.microsoft.com/en-us/goglobal/gg680285



Una de las cosas que observamos es que no todos los códigos de 0 a 255 están asignados en esta subtabla, sino que los primeros 64 han quedado sin asignación.

Como sea, aquí se presentan cuestiones a la hora de tratar esto a nivel de programación.
¿Cómo tratamos los caracteres multibyte si somos programadores?
Si guardamos el archivo de texto en un array de bytes, tendremos que ir leyendo los caracteres uno a uno, y cuando detectemos un byte con un número "en gris", lo interpretaremos como el indicador de una subtabla, y así el siguiente byte leído será el caracter de esa subtabla.
Como no todos los números de 0 a 255 tienen asignado un caracter en la subtabla, habrá que tomar decisiones cuando se encuentre uno de esos  códigos no utilizados. Lo más normal será imprimir un espacio en blanco, o inclusive no hacer nada.
Los números de 0 a 31 quizá puedan seguir considerándose como "de control", pero esto supone una cierta ambigüedad, pues entonces, ¿para qué indicamos un número "en gris" para seleccionar una subtabla, si luego no pretendíamos elegir ningún caracter de dicha subtabla?
Si se trata de un error en la codificación, puede usarse esto como un punto de restauración de la misma.

Básicamente, el cambio entre 1 byte y 2 bytes en un mismo archivo es candidato a los desastres.
Si el archivo se almacena con errores, o si los programas que procesan el archivo de texto cometen errores, se perderá la información.
Lo ideal sería, pues, mantener consistentemente una estructura de 1 byte por caracter, o bien de 2 bytes por caracter, pero no esto de ir cambiando "de camino".

No tengo claro aquí cuál se supone que es el modo en que se almacena la información de un texto con codificaciones de 2 bytes.
[Requiere investigación - Cualquier ayuda se agradecerá]

Es más factible que podamos estudiar los archivos de texto con codificaciones de 2 bytes para tablas más modernas, como Unicode.



Hay otras páginas de códigos que figuran en las tablas del post anterior.
Se refiere a tablas de caracteres usadas por otros fabricantes (Macintosh, etc.).
Tienen ellos también sus versiones para distintos idiomas, como siempre.
Pasaremos por alto los detalles.



Quiero aquí mencionar que hubieron ciertos estándares ISO para caracteres internacionales.
Me refiero a las normas ISO 8859-XX, cada una dando un sistema de codificación adaptado a las necesidades de cada país.
Ahora bien, Windows creó sus propias versiones, ampliando las normas ISO 8859-XX.
Esas páginas de códigos corresponden a los números de la tabla anterior: 1250 a 1258.
También tenemos para el Tailandés la página de códigos 874.
Todas ellas son de 1 byte por caracter.



Se incluyen en la tabla codificaciones de todo tipo, incluso las mismas de ISO aparecen a partir del número 28591.
Hay también creaciones de los japoneses de diverso tenor, cosas como el/los ISCII, entre muchos otros alfabetos extraños e improvisados por distintos grupos de personas.
Entre ellos habrá codificaciones de 1 byte o más, como las que mostramos antes.

Es una ensalada de codificaciones que parece no tener fin. Es un panorama complejo y confuso.
Y eso que sólo hablamos de caracteres para archivos de texto, que parecía ser la cosa más simple del mundo informático.

Entre toda esta ensalada destacan elementos de mayor importancia: las codificaciones UTF (Unicode) de 7, 8, 16 y posiblemente más bits,
que figuran en los números 65000, 65001, 1200/1201.
También nombremos al ASCII básico de 7 bits, que tiene su número de página de códigos 20127.
Los números 65000 y 65001 son en realidad pseudo páginas de códigos.
Con esto me refiero a que cada página de códigos tiene algún archivo en Windows que detalla cuáles son los caracteres que la componen, y otros detalles de funcionamiento (archivos NLS).
Pero 65000 y 65001 no tienen tales archivos asociados, y así han de cumplir otra función: posiblemente indicar que Unicode está activo para cierto archivo.

Vislumbrar por ejemplo:

http://web.archive.org/web/20040225223721/http://www.sharmahd.com/tm/codepages.html



Las páginas de códigos de Windows nos han obligado a avanzar en la historia de los caracteres, y hemos tenido que entremezclarnos con las normas ISO y el Unicode, sin aún haberlos detallado.
En los próximos posts hablaremos de esto.

La idea de fondo es que todos los archivos de texto del mundo pasen a transformarse hacia Unicode, y esto incluye archivos TXT, nombres de archivos en los sistemas operativos, páginas HTML, archivos fuentes de programas, etc.

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

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
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,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
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.