martes, 15 de diciembre de 2015

T2. CODIFICACIONES DE CARÁCTER. LA UNIÓN HACE LA FUERZA.

ESTRATIFICACIÓN EN UN CORTE DE LA LADERA DEL BARRANCO DE LEMES, ARICO, SUR DE TENERIFE
     Los primeros ingenieros informáticos concibieron que las computadoras almacenaran cada carácter de cualquier que pasásemos a su memoria interna en un formato específico llamado BYTES, es decir, una secuencia de valores formada por 8 BITS que van desde 0x00 a 0xFF, sin incluir entre medias signos de ningún tipo: he aquí la base numérica del tan temido Código Máquina (¡brrrr!).
Como consecuencia de ello se crearon ESQUEMAS DE CODIFICACIÓN, donde se asignaba a cada carácter concreto un byte propio, exclusivo, que lo define e individualiza con respecto al resto de caracteres. Como no existían por aquel entonces estándares ni convenciones, cada uno "tiró por su lado", y así surgieron esquemas como ASCII y LATIN-1, entre otros que, en parte eran coincidentes, sobre todo en los primeros 127 caracteres en tanto que son los más comunes en el ámbito occidental, pero donde la mayor parte de las especificaciones eran distintas.
Posteriormente se agregaron muchos más esquemas de codificación a la fiesta. Pero al final, en un mudo globalizado, con un trasvase de información continuo y masivo, virtual e intrínsecamente transfronterizo, caló pronto la idea de contar con un esquema común para todos los países. Una de las propuestas en este sentido más sólidas, coherentes en su estructura  y aceptadas en la actualidad es la Codificación Universal (Unicode).
Unicode, de modo similar a los esquemas de codificación originales, asigna cada carácter de un idioma (junto con otros signos) a un número entero, pero con la novedad de que no se limita a usar un único byte por carácter, sino que es capaz de representar, en una sóla línea de bytes, cualquier carácter de cualquier idioma, con más de un millón de caracteres definidos de esta forma hasta la fecha de hoy.
Unicode recurre a un método solvente de almacenamiento como una secuencia de números enteros de 32 bits (4 bytes). Obviamente, sobra espacio en la memoria por carácter que Unicode aprovecha para guardar información en un doble formato:
  • UCS-2: Enteros sin signo de 16 bits (2 bytes) de longitud que representa a los primeros 65535 caracteres.
  • UCS-4: Enteros, con y sin signo, del largo estandarizado de 32 bits (4 bytes) de longitud que representa a todos los caracteres codificados hasta ahora: 1114111.
Cuando Python compila, utiliza uno de estos dos formatos. si sys.maxunicode es 65535 es que está haciéndolo en el primero de ellos; en caso contrario, lo está haciendo con el segundo.



Tanto con los datos que se guardan en archivos como los datos que introducimos en el tráfico de internet, en el caso de Unicode se pueden re-codificar con UTF-8, que poco a poco se va estandarizando cada día más, más sencillo; UTF-16, más complejo, (usa 2 bytes por carácter en lugar de uno, como  UTF-8, que sólo recurre al doble byte, después de los 127 primeros caracteres, lo que lo hace muy parecido a ASCII); ISO-8859-1ISO-8859-5; etc.
Contamos con el método str.encode() de las strings (estudiamos los métodos de las strings en el capítulo siguiente) que devuelve un objeto del tipo de dato bytes, codificado según el argumento que le pasemos:


La 'b' indica que tenemos un literal de tipo byte en lugar de un literal de tipo string (cadena) tal y como lo conocemos. El primer argumento no es CASE SENSITIVE, con lo que da lo mismo que escribamos en minúsculas que en mayúsculas y, además, podemos suprimir signos ortográficos, como los guiones. El segundo, opcional, nos permitirá gestionar los errores.
El método complementario (también 'contramétodo') de str.encode() es un método de los bytes: bytes.decode(), cuya invocación devuelve una cadena de tipo string con los bytes decodificados de acuerdo al esquema de codificación que le hayamos proporcionado:


De manera predeterminada, los módulos de Python, *.py, se almacenan en memoria en formato UTF-8, que como hemos dicho, es un formato sencillo y cada vez más universal, lo que implica que Python entenderá y soportará la casi totalidad de cadenas, cualquiera que fueran sus caracteres componentes, que le pasemos.
Caso aparte ocurre cuando Python recibe datos de fuentes externas al propio programa: internet, intranet, memorias USB, etc., en tanto que desconoce de antemano en qué esquema de codificación está configurada la información por lo que siempre resulta conveniente conocer su codificación y en el caso de que no fuera la deseada, o bien re-codificar a UTF-8, o cuando menos, emplear o traducir a cualquier esquema de codificación subsidiario de Unicode. También es posible descargar traductores desde librerías de terceros aunque no suelen producirse situaciones de este tipo.
Existe un índice de paquetes (packages. Ya veremos lo que son a su debido tiempo) de Python donde se mencionan y se pueden enlazar a algunos que son capaces de detectar la codificación de cualquier archivo que pasemos.

PAISAJE DE ALTA MONTAÑA DESE LA ZONA SUR, PRÓXIMO AL PARQUE NACIONAL DE LAS CAÑADAS DEL TEIDE

No hay comentarios:

Publicar un comentario