viernes, 24 de agosto de 2018

¿Cómo soluciono los errores de codificación de caracteres en archivos de texto en Ubuntu?

¡Trabajadores!

En su constante evolución, el hombre ha pasado distintos estadíos. Primero en las cavernas, luego en tribus, para finalmente conformar políticamente clanes, ciudades estado, reinos, y naciones. Sin embargo, esta evolución social y política no hubiese sido posible sin el consecuente avance del lenguaje y la escritura, que la cimentó y posibilitó las instituciones de avanzada que rigen el devenir de la historia.


En la misma tenida histórica, nuestros antepasados se han valido de lenguajes formados por convenciones sociales, de forma hablada. Luego se utilizaron pictogramas en las cavernas, y finalmente se transitó al jeroglífico e ideogramas. Desde los tiempos de Nabucodonosor a esta parte, nos hemos valido de lenguajes escrito para conservar y transmitir las ideas. En base a ellos se crean los alfabetos de las grandes civilizaciones humanas.

No es secreto para nadie que, en la medida que existen diferencias entre las culturas que acunan a los hombres, existen diferenciaciones entre los distintos alfabetos, según los lenguajes e idiomas que utilicemos. Nosotros utilizamos el alfabeto latino, con particularidades que tiene el castellano traído a las Américas. En una serie fluida de convencionalismos, disponemos de nuestras propias reglas idiomáticas, las hacemos nuestras y son nuestro medio de expresión.
Pues bien, si a esto lo llevamos a la telemática, nos encontraremos con la necesidad de representar numéricamente  en la computadora (de forma binaria) varias decenas de caracteres para almacenar la información. Esta debe ser comprendida no sólo por el sistema informático, sino por todos los demás sistemas informáticos con los que deseemos intercomunicarnos; estamos - entonces - en la era de la información. Adicionalmente no podemos ser eurocéntricos: hemos de poder dar lugar también a centenas o miles de caracteres, según usemos alfabetos latinos, cirílicos, asiáticos, semitas, del valle del indo, etc; de todo hay en la viña del Xeñor...

El Movimiento Justicialista entiende esta panoplia necesaria para comunicarnos con todos los hombres de buena voluntad de la Tierra, pero esto no fue obvio para quienes - a través de su  pernicioso imperialismo cultural - intentan sojuzgar a los Pueblos. Ellos dieron en iniciar las convenciones para convertir información binarias a caracteres en base al alfabeto latino limitado que emplean los anglosajones. Esto es particularmente triste pues el inglés se trata de uno de los idiomas más simplones y que requiere menos caracteres, y que se presenta especialmente ilimitado para el resto de los ricos idiomas del mundo (el castellano entre ellos).

Esto obligó - con el correr de pocos años - a especificar distintas convenciones informáticas que extendieran la cantidad de caracteres y símbolos posibles de reproducir por un sistema computado. Estos múltiples estándares de codificación son bastante compatibles entre sí, pero no lo son completamente, y en ciertos casos pueden provocar discrepancias en la representación de un texto codificado con un formato antiguo o distinto a los actuales.

En GNU con Linux, este tipo de errores se da cuando transferimos archivos de texto originados en sistemas diferentes, específicamente cuando se emplean codificaciones de texto distintas a la UTF-8 que se usa actualmente. En otros casos puede suceder lo mismo, dependiendo de la codificación que use el sistema.

Un ejemplo suele aclararlo todo, como decía Napoleón. Si tenemos un texto codificado en el viejo estándar de M$-DO$ de los 90s, podríamos ver que al abrirlo con un editor actual, muchos caracteres del castellano los representa con errores. Por ejemplo:
Evitar este problema actualmente es simple: basta utilizar una codificación moderna, como la extendida Unicode o su variación más común, la UTF-8.  Naturalmente los editores modernos en GNU y otros sistemas actuales ya lo hacen por defecto.

Sin embargo, si el texto ya está realizado, parecería necesario el arduo trabajo de buscar y reemplazar los caracteres erróneos por los que corresponde. Afortunadamente en nuestro sistema GNU con Linux podremos convertir la codificación mediante el programa iconv.

Iconv es un pequeño conversor codificaciones para texto que opera en la consola terminal de un sistema GNU con Linux como lo es Ubuntu. Para abrir una terminal ingresamos Ctrl+Alt+T, y podremos emplear el comando.

Para que funcione debemos usar la siguiente sintaxis:

iconv -f codificación_de_origen -t conversión_destino archivo_original.txt archivo_destino.txt

Como vemos, es preciso conocer la codificación de origen del archivo de texto original y la codificación de destino que queremos darle. El problema es que las opciones de codificación son numerosísimas; en particular esta opción de iconv puede operar 588 conversiones distintas (ida y vuelta) para totalizar 1176 posibilidades. Si queremos verlas todas, podremos ingresar en nuestra terminal iconv -f y presionar la tecla Tab, y el sistema nos devolverá todas las opciones (debemos presionar la barra espaciadora para paginar la lista).

Para hacer las cosas mas sencillas os explicaré en detalle las conversiones más utilizadas, y por tanto las que cobran mas relevancia histórica.
  • US-ASCII: Es el estándar de codificación mas viejo para teletipos (télex tipo americano), y no permite acentos ni eñes, solo mayúsculas y minúsculas, junto con caracteres de comunicación y control. Esta prácticamente no requiere conversión, pues no presenta caracteres especiales.
  • CP437: Es la antigua codificación empleada en MS-DOS y las PC originales. Estaba limitada a la memoria ROM del hardware de video de las computadoras de los 80s que contenía el conjunto de caracteres (unas pocas docenas de ellos incluyendo caracteres gráficos. Se la usó mucho durante los 80s y 90s. No tenía mayúsculas acentuadas, diéresis ni ñ mayúsculas.
  • CP850: Codificación empleada en MS-DOS llamada "Europa Occidental", que extendía a través de un software residente en memoria del sistema operativo MS-DOS los caracteres de las plaquetas de video originales, a fin de para suplir los problemas de la anterior, con la que retenía compatibilidad. Se la llamaba "ANSI".
  • ISO-8859-1: Codificación llamada "Latin-1", europea. Es de principios de los 90s pero se extendió hasta mediados del 2000.
  • Windows-1252: Codificación empleada por Windows 95 y superiores. Es casi similar a ISO-8859-1 salvo por unos caracteres de monedas y puntuación, y encomillado. Es muy común confundir la codificación de caracteres Windows-1252 con la de ISO-8859-1. El resultado habitual era que todas las comillas y apóstrofos (producidos por las "comillas inteligentes" de Micro$oft) son reemplazadas por signos de interrogación o por cajas en sistemas operativos libres.
  • ISO-8859-15: Codificación llamada "Latin 9". Reemplaza algunos caracteres y agrega el de Euro (€), modernizando la ISO-8859-1. Sirve para todos los idiomas de Europa occidental.
  • UNICODE: también llamada UTF-16, En la medida que aumentó la memoria y capacidad gráfica de los sistemas, se propuso este conjunto de amplia estandarización, que pretende incluir todos los caracteres para intercambios multilingûes, por lo cual es preferida para evitar problemas de conversión. Incluye también miles de ideogramas asiáticos, e incluso caracteres históricos (arameo antiguo, hebreo, persas, etc). El Unicode dispone de varios ordenamientos, que varían en cuanto a la representación en bytes y orden. Esto no suele ser de gran importancia pues mayoritariamente se utiliza la codificación más simple, de Unicode, la UTF.8
    UTF-8: Codificación preferida por Linux y la mayoría de los sistemas modernos y normalmente es la recomendable.


Por lejos el caso más común es convertir entre codificaciones "viejas" de DOS o Windows a la nueva UTF-8. Si quisiéramos convertir el archivo original "razon.txt" codificado en Windows-1252 a la codificación actual UTF-8 y llamarlo "razon_corregido.txt", debemos ingresar el siguiente Comando de Organización:

iconv -f WINDOWS-1252 -t UTF-8 razon.txt > razon_corregido.txt 

Y el archivo será corregido, quedando de la siguiente manera:


Para colmo de complicaciones, existen distintos tipos de condificación para indicar la creación de una nueva línea. En archivos de texto DOS/Windows, un salto de línea, también conocido como nueva línea, es una combinación de dos caracteres: un retorno de carro (CR) seguido por un salto de línea (LF). En archivos de texto Unix, un salto de línea es solamente un carácter: el salto de línea (LF). En archivos de texto Mac, antes de Mac OS X, un salto de línea era sólo un carácter retorno de carro (CR). Actualmente, Mac OS usa el estilo Unix de saltos de línea (LF).

Esto hace que los archivos de DOS/Windows antiguos aparezcan con líneas "cortadas". Para este tipo de archivos no alcanza con convertir la codificación, y por ello existe un programa específico que se encarga de todo. Se trata del paquete dos2unix, que consta de dos programas, el mismo dos2unix y el conversor contrario, unix2dos. Ambos forman parte del primero y los instalamos con el siguiente comando de organización:

sudo apt-get install dos2unix

Para hacer la conversión usamos:

dos2unix parámetros -n archivo_original.txt archivo_destino.txt

...si necesitamos realizar el paso inverso, podremos usar:

unix2dos parámetros -n archivo_original.txt archivo_destino.txt

Los parámetros son:

-ascii: Sólo convierte los saltos de línea.
-iso: Convierte con ISO-8859-1
-1252: Convierte usando la codificacin Windows-1252
-437: Convierte usando la codificación CP437
-850: Convierte usando la codificación CP850 europea.
-7: Convierte usando la codificación de 7 bits (desde 1982 se usa de 8 bits, esta se usa para archivos de teletipo o codificaciones muy antiguas).
-i: muestra información sobre la coficación del archivo indicado.

No hay comentarios:

Publicar un comentario