Franklin Pezzuti Dyer

Home     Posts     CV     Contact     People

Una pequeña anomalía de codificación

Hace unos días visité la librería Barnes & Noble con mi novia y compramos tres libros. Noté un detalle curioso en el recibo que nos dieron después de la compra. ¿Lo notas?

Fig 1

El primer libro se titula La hipótesis del amor pero se ha impreso como La hip≤tesis del amor en el recibo. Si te interesa un pequeño rompecabezas del googleado, intenta averiguar a qué se podría deber este errorcito. Yo tengo mi propia explicación tentativa de esta peculiaridad y la describiré a continuación.

La primera posibilidad que se me ocurrió es que tenga algo que ver con la manera en la que se codifica el texto. Pues en un ordenador, los glifos, o sea los formas geométricas que se consideran símbolos aislados como las letras del alfabeto latín a,b,c,...,A,B,C,... o las cifras arábigas 0,1,2,..., se codifican como cadenas de bits, como casi todo lo que se almacena en formato digital. Así que, para convertir un documento digital en algo legible o mostrando los glifos encadenados en la pantalla o imprimiéndolos en, digamos, un recibo, hace falta convertir la cadena de bits que constituye un fichero en una sucesión de formas geométricas.

Pero hay distintos estándares que dictaminan cómo convertir entre bits y glifos. Si el programa que genera un fichero de texto supone una regla para convertir entre bits y glifos mientras que el impresor emplea otra, entonces el texto impreso puede ser distinto del texto mostrado en la pantalla. Mi hipótesis, entonces, es que el programa que se ha utilizado para generar la representación digital del recibo utiliza una página de códigos distinta de la que utiliza la impresora de recibos. Las dos páginas deben ser iguales en cuanto al cifrado de la mayoría de los caracteres utilizados con frecuencia, como los del alfabeto latín y las cifras arábigas, y diferenciarse en las traducciones de caracteres menos utilizados. En concreto, la cadena de bits que representa ó según la página de códigos del proceso que generó el fichero debe de representar el glifo en la página de códigos que utiliza la impresora.

El siguiente paso era ir buscando a ver si podría encontrar dos páginas de códigos verosímiles que podrían haber producido este error. Una referencia útil es el libro Fonts and Encodings por Yannis Haralambous, que cuenta con detalle la historia de varias páginas de códigos comunes. Uno de los códigos más conocidos se llama ASCII. Originalmente representó cada glifo como una sucesión de $7$ bytes, los cuales también se puede representar como dos cifras hexadecimales tal que la primera se restringe a las cifras 0-7. Aquí está una tabla del libro de Haralambous que representa la versión 1967 de ASCII:

Fig 2

Se ve que ASCII-1967 es bastante limitado, pues no incluye el glifo ó ni . (A propósito, sí es que hay una manera de representar acentos en ASCII-1967 aunque es muy torpe. El ó se puede representar como 0x6F0827, en el que se usa el carácter de retroceso para superponer un o con un apóstrofo. Se supone que el se podría representar semejantemente como 0x3C085F.)

Pero muchas de las páginas de códigos que se usan más hoy día son versiones extendidas de ASCII, es decir, son códigos de $8$ bits en las que los códigos de 0x00 a 0x7F son iguales a los de ASCII mientras que los códigos de 0x80 a 0xFF son propios a la versión concreta. Para encontrar un punto de partida para mi búsqueda, busqué especificaciones para algunas impresoras de recibos, aunque no conozco el tipo concreto de impresora que se ha usado en la librería. Por ejemplo, el guión de esta impresora tiene en la página 14 una lista de conjuntos de caracteres, entre los cuales los que me parecen más relevantes a primera vista son:

Buscando las tablas de estas páginas de códigos, encontré que las páginas 437 y 1252 cumplen las propiedades necesarias. Es decir, las dos se basan en ASCII, pero el código 0xF3 representa el glifo en la página 437 mientras que representa el glifo ó en la página 1252. Por tanto, mi conjetura es que el proceso que ha generado el recibo estaba utilizando la página de códigos 1252 (tendría sentido, pues muchas veces se utilizan ordenadores Windows en las empresas) mientras que la impresora estaba traduciendo según la 437, probablemente debido a una configuración por defecto. Aquí están los trozos de las dos páginas de códigos que no son heredados de ASCII:

Fig 3

Si es correcta, entonces mi hipótesis permitiría predecir otros fallos más allá de la sustitución de en lugar de ó, por ejemplo un ± en lugar de ñ o un µ en lugar de æ. Pues si vuelvo a este Barnes & Noble, me aseguraré de comprarme el libro con el título que incluye la mayor cantidad posible de glifos fuera del conjunto de ASCII-1967, a ver si se confirma mi conjetura.


back to home page