domingo, noviembre 30, 2008

Codificación de caracteres con iconv

He dado con este comando y me ha solucionado un problema con el que llevaba varios meses. El hecho de tener que utilizar un laptop en el trabajo con Hasefroch y tener que mirar de vez en cuando algún que otro pequeño manual en texto plano, y este mismo ya modificado, tenerlo que ejecutar en una máquina GNU/Linux en casa, me hizo encontrarme con el problema de los caracteres.
Sabemos que los ordenadores transforman cualquier cosa en codigo , por lo que codifican para poderlo interpretar. Necesitan buscar combinaciones para poder interpretar toda la variedad de caracteres que representan nuestros diferentes alfabetos.
Cómo existen la tira, Hasefroch por ejemplo utiliza normalmente ASCII , Mac OS X usa normalmente UTF-8 y Debian que es mi máquina usa generalmente ISO-8859-1 pero en mi caso usa UTF-8 , como se muestra aqui, al escribir locale en consola :

locale

LANG=es_ES.UTF-8
LC_CTYPE="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_ALL=


Los problemas vienen cuando ejecutas un archivo en tu máquina que fué creado con una codificación diferente a la que soporta de forma predeterminada. El archivo no se visualizará bien. Como podemos ver en esta imagen:




Nos puede pasar cuando cambiemos de distribución, cuando hayamos salvados los datos de un disco antigüo y los hemos ejecutado en el sistema nuevo o como he comentado más arriba el hecho de usar Hasefroch y GNU/Linux para ejecutar el mismo fichero una vez modificado.

Con el comando file podremos ver el formato actual :

file restricción_de_llamada.txt
restricción_de_llamada.txt: ISO-8859 text, with CRLF line terminators


En mi caso el sistema tiene por defecto el UTF-8 y este mismo texto plano fué creado en el Hasefrog y tiene la codificación de ISO-8859 ( aunque deberemos usar ISO-8859-1 para que funcione). Aqui es donde deberemos usar iconv para realizar la conversión.

iconv -f ISO-8859-1 -t UTF-8 restricción_de_llamada.txt > restricción_de_llamada2.txt

Es decir:

El nombre de la herramienta.
El parámetro -f (para indicar from) seguido de la codificación del fichero
El parámetro -t (para indicar to) seguido de la nueva codificación y el nombre del fichero a convertir.
El redirector es útil en este caso para que el resultado no lo muestre por pantalla y lo vuelque a ese fichero nuevo.

Para más dudas siempre usar la ayuda del comando:

iconv --help


Si queremos mantener por defecto una codificación en el sistema podríamos cambiar las variables del sistema.
Una manera sería :

export LC_ALL=

es decir,

export LC_ALL=es_ES.UTF-8

para que se ejecuta cada vez que arranquamos y ahorrarnos teclearlo cada vez, lo añadiremos al .profile de nuestro /home.

Espero que sea útil.