¿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.