Encoding y decoding (El porqué de los caracteres raros)

Son términos que generalmente la gente de a pié desconoce ¡incluso algunos profesionales del sector! Pero… ¿Y si hablamos del problema de los caracteres raros? Seguro que si estás leyendo esto es porque te ha pasado. Has editado un fichero de texto en un ordenador, te lo has llevado a otra máquina, lo has abierto y… ¡Zas! Lo que antes eran vocales acentuadas y otros caracteres poco comunes como puede ser la “u” con diéresis, ahora aparecen como unos caracteres y símbolos raros, o peor todavía, todo tu texto se ha convertido en símbolos raros. Esto es lo que comúnmente se conoce como el problema del “Encoding” y el “Decoding”.

Encoding: “Sistema que consiste en un código que empareja cada carácter de un repertorio con alguna cosa como una secuencia de números naturales, octetos o pulsos eléctricos con el fin de facilitar la transmisión de información (generalmente números y texto) a través de las redes de telecomunicaciones o almacenamiento de texto en computadores”.

Decoding : “Es el proceso inverso de encoding (codificación), el cual es un proceso de trasformación de la información de un formato a otro”.

Las definiciones han sido extraídas de Wikipedia (la traducción ha corrido a mi cuenta), fuentes originales: encoding y decoding.

Como ya estarás intuyendo a estas alturas, el problema no es del fichero en sí, puesto que la información está ahí, es inamovible. El problema es la interpretación de la información. Una máquina expresó la información (grabó el fichero) usando un código determinado, y la otra máquina al leer la información usó un código distinto, mostrándonos por pantalla una información confusa. Un ejemplo sería una persona que escribe una carta en castellano y se la envía a un amigo Alemán, el amigo recibe la carta e intenta leerla como si estuviera en su lengua materna. Obviamente no encontrará sentido alguno al texto.

Las máquinas (más concretamente los sistemas operativos) a diferencia de la personas, no utilizan lenguas, utilizan protocolos y juegos de caracteres. He aquí la raíz del problema. Al trasladar ficheros de una máquina a otra hay que asegurarse de que tanto la máquina emisora como la máquina receptora usen el mismo juego de caracteres.

Generalmente la conversión entre juegos de caracteres la realiza el Sistema Operativo (SO) de forma transparente al usuario. La información llega a través de la red, o bien reside en el hardware (disco duro) en forma de datos binarios (bytes). El SO es el encargado de acceder a esta información y realizar las operaciones de Encoding (codificación para lectura) o Decoding (decodificación para escritura) pertinentes, una vez realizadas estas operaciones, la información se pasa a las distintas aplicaciones que se ejecutan en la máquina.

Tal y como se puede observar en el diagrama, la información está en el hardware en forma binaria (ceros y unos). Es el sistema operativo quien accede a ella, la interpreta (encoding), es decir la mapea a un juego de caracteres concreto y la muestra al usuario.

Al trasladar información de una máquina a otra es cuando pueden aparecer los problemas ya que si la máquina que originó la información utilizó un juego de caracteres distinto, decodificó esa información a binario basándose en ese juego de caracteres. Por tanto la máquina receptora deberá codificar (mapear) la información binaria al juego de caracteres correcto, de lo contrario aparecerán inconsistencias.

En el diagrama expuesto anteriormente se ha tratado el caso más común, el usuario crea un fichero de texto en una máquina (Windows en español usa nativamente la codificación CP-1252) y lo transporta mediante una memoria USB a otra máquina (Linux usa nativamente UTF-8). Como el sistema operativo receptor de la información no tiene constancia del origen del fichero asume que el fichero se editó usando el código de caracteres local y por tanto lo lee y lo muestra al usuario haciendo las operaciones de encoding habituales. Es aquí donde aparecen las inconsistencias.

Veamos el ejemplo anterior con mayor detalle. Supongamos que el texto del fichero es el siguiente:

Aquí estamos probando la codificación de caracteres. Ojalá que todas las máquinas usasen la misma codificación, pero desafortunadamente no la usan y por tanto hay que recurrir a diferentes conversiones. Los caracteres que normalmente se ven mal son:
Á É Í Ó Ú Ü á é í ó ú ü.

Este texto se creó usando la codificación CP-1252. Al abrirlo en una máquina que use Linux (Usa por defecto UTF-8 como codificación) el mensaje obtenido será el siguiente:

Aqu� estamos probando la codificaci�n de caracteres. Ojal� que todas las m�quinas usasen la misma codificaci�n, pero desafortunadamente no la usan y por tanto hay que recurrir a diferentes conversiones. Los caracteres que normalmente se ven mal son:
� � � � � � � � � � � �

Como se puede comprobar casi todos los caracteres se ven bien excepto los caracteres “raros”, esto es debido a que los 128 primeros caracteres (0-127) son tomados directamente del ASCII en todas las codificaciones, estos caracteres abarcan únicamente las letras del alfabeto inglés. Es decir que las letras del alfabeto inglés son comunes en todas las páginas de caracteres y codificaciones, mientras que los caracteres “raros” varían dependiendo de la codificación que se adopte.

Por ejemplo el carácter “á” es el 225 (#E1) en CP-1252 y solo se necesita un byte (8 bits) para representarlo, mientras que en UTF-8 se necesitan dos bytes para representar el mismo carácter. El primer byte (#C3) selecciona la página de caracteres y el segundo byte( #A1) el carácter dentro de la página.

¿Por qué cuando mando un email no hay problemas de encoding y decoding?

A estas alturas a lo mejor te estas preguntando cosas como por qué al enviar un e-mail no se producen estas inconsistencias. Esto se ve mucho mejor con un ejemplo, supongamos que enviamos un e-mail a un amigo que tenemos en alemania.

En internet el estándar es usar UTF-8, este juego de caracteres abarca todos los caracteres de todas las lenguas (internet es la red mundial). Por tanto nuestro sistema operativo se encargará de transformar la información de CP-1252 (Código de caracteres de Windows para lenguajes europeos Occidentales) a UTF-8 y enviar la información en forma binaria a través de la red. La máquina receptora se encargará de traducir de UTF-8 al código de caracteres correspondiente. En el ejemplo traduce otra vez a CP-1252, puesto que nuestro amigo alemán usa también Windows, y además lo tiene instalado en alemán usa el mismo código de caracteres que nosotros.

En el caso del correo electrónico nunca habrá problemas de encoding y decoding. Los problemas aparecen cuando transportamos los ficheros de una máquina a otra (a través de memoria persistente (discos ópticos, disquetes, memorias usb, etc…), o a través de medios electrónicos (descargas de servidores, ficheros adjuntos en correos electrónicos, etc…). Es en estos casos, cuando la información transportada se hace a través de un canal del cual la máquina receptora no tiene constancia, cuando surgen los problemas, ya que el SO no realiza la conversión implícita correspondiente, y esta tarea le queda pendiente al usuario.

¿Por qué con los documentos de Word y OpenOffice no hay problemas de encoding y decoding?

En los documentos de Office y OpenOffice no hay problemas de encoding y decoding principalmente porque la aplicación guarda en cada documento el tipo de codificación en que fue creado el documento. De este modo es la propia aplicación la que se encarga de realizar las conversiones correspondientes (en caso de que fueran necesarias) dependiendo del SO o del código de caracteres que se use de forma nativa en cada SO.

Acerca de franciscoguemes

Ingeniero en Informática
Esta entrada fue publicada en Me cansé de predicar por barrios. Guarda el enlace permanente.

2 respuestas a Encoding y decoding (El porqué de los caracteres raros)

  1. Pingback: Gestión de propiedades en aplicaciones Java | Francisco José Güemes Sevilla

  2. Pingback: Codificación de caracteres en Eclipse | Francisco José Güemes Sevilla

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s