Inicio arrow Artículos arrow Linux arrow Conversión de archivos a UTF-8
Menú Principal
Lo más leído
Consigue Firefox
Usuarios
993 registrados
1 hoy
5 esta semana
138 este mes
Último: gabity...
Formulario de acceso



... Regenerar clave
... Registro
Conversión de archivos a UTF-8 Imprimir E-Mail
domingo, 22 de enero de 2006

En numerosas ocasiones, cuando publicamos contenidos en web bajo un servidor linux, nos hemos visto en la necesidad de convertir la codificación de un determinado archivo al estándar utf-8. Casi siempre por desconocimiento de las peculiaridades de nuestro sistema, terminamos haciendo dicha conversión desde Vim o desde un sistema con MS Windows.
En este artículo aprenderemos a usar la herramienta de conversión iconv y veremos cómo podemos usarla para convertir una base de datos completa de Mysql.

iconv, el codificador de texto

Aunque a buen seguro tendremos instalado iconv en nuestro sistema, no estaría de más comprobar que, en efecto, es así. Por ejemplo, teclearemos lo siguiente en la consola:

# whereis iconv

Que nos devolverá la ruta de instalación del programa, habitualmente en /usr/bin/iconv . Si no estuviera instalado, buscaríamos el paquete adecuado para nuestra distribución y lo instalaríamos. Por ejemplo, para un sistema Fedora, el paquete que contiene a la utilidad es glibc-common cuya última versión es glibc-common-2.3.5-10.3. Las últimas versiones de PHP soportan igualmente iconv como comando nativo. Para más información, podemos visitar la página de la librería GNU C en http://www.gnu.org/software/libc/ .

La sintáxis del comando es muy simple:

iconv -f encoding -t encoding inputfile

El primer parámetro (-f) indica la codificación actual del archivo. El segundo parámetro (-t), la codificación de salida del archivo, que pasaremos como tercer parámetro (inputfile). La salida de los datos se hace por la consola estándar, aunque tendremos la oportunidad de usar el parámetro --output, -o file para indicar una salida hacia otro lugar que no sea la consola. Así, una conversión de un archivo en formato ISO-8859-1 a utf-8 quedaría como sigue:

iconv -f iso-8859-1 -t utf-8 archivo_ISO.txt > archivo_UTF.txt 

Si queremos obtener un listado de los formatos disponibles para la conversión, usaremos el siguiente comando:

iconv --list


Utilizando iconv

Como apuntábamos en la introducción, podemos usar iconv para convertir bases de datos completas en Mysql a una nueva codifiación. Los pasos a seguir serían tan simples como estos:

# mysqldump -u [admin] -p –add-drop-table db > db.sql

# iconv -f iso-8859-1 -t utf-8 db.sql > db-utf8.sql

Ya tratamos el uso comando mysqldump en otro artículo anterior, así que, teniendo como base nuestro nuevo archivo db-utf8.sql codificado en utf-8, volcaremos todos los datos a Mysql:

mysql -u [admin] -p db < db-utf8.sql

Como iconv está soportado por PHP (al menos desde la versión 5), podríamos programar un sencillo script que convirtiera, en caso de necesidad, múltiples archivos de una codificación a otra. E incluso podríamos programar un script en nuestro bash de linux. Como ejemplo y para finalizar este artículo, observemos este script que convierte recursivamente a utf-8 todos los archivos de un directorio:

#! /bin/sh

# Chequeamos los parámetros de la línea de comandos
if [[ ! -d $1 ]]
then
        echo "¡Error en los parámetros! Uso: $0 <directorio>";
        exit 1
fi

# Crea los archivos temporales
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

# Localiza todos los archivos en el directorio
find $1 -type f > $tempfile;

# Abre el archivo temporal
exec 3< $tempfile

while read -u3 filename
do
        # Chequea el tipo de codificación del archivo
        typefile=$(file --mime "$filename");
        if [[ -n $(echo $typefile | grep "text/") ]]
        then
                encoding=$(echo $typefile | cut -d'=' -f2);
                if [[ $encoding != "utf-8" ]]
                then
                        if [[ -n "$(iconv --list | grep -i $encoding)" ]]
                        then
                                # Cambia la codificación
                                tempfile2=`tempfile 2>/dev/null` || tempfile2=/tmp/test$$
                                trap "rm -f $tempfile2" 0 1 2 5 15
                                iconv --from-code=$encoding --to-code=utf-8 "$filename" > $tempfile2
                                mv -f $tempfile2 "$filename"
                                echo "$filename: $encoding -> utf8";
                        fi
                fi
        fi;
done;

exec 3<&-

 

Comentario[s]

Sólo los usuarios registrados pueden escribir comentarios.
Por favor, valídate o regístrate.

Powered by AkoComment 2.0!

 
< Anterior   Siguiente >