FireStats error : FireStats: Unknown commit strategy
5
Convertir de ISO-8859-1 a UTF-8

Trabajando en uno de mis proyectos, me vi en la necesidad de hacer una conversión completa del Charset de todos mis archivos y bases de datos de ISO-8859-1 a UTF-8.

Pongamos un ejemplo particular; un proyecto con archivos PHP, HTML y JavaScript en una codificación ISO-8859-1 y una base de datos MySQL con una codificación latin1_spanish_ci. El objetivo es: convertir los archivos del proyecto a UTF-8 y la base de datos a utf8_general_ci.

CUIDADO, tanto en la conversión de archivos como en la base de datos; los archivos originales se sobreescribirán, por lo que es altamente recomendable que se realice un RESPALDO antes de continuar.

En nuestro ejemplo definiremos la ubicación de los archivos en “/proyecto/html” y el nombre de la base de datos es “db_proyecto“.

Según el manual: GNU ‘recode’ convierte ficheros entre varios juegos de caracteres y su modo de empleo es la siguiente:

recode [OPCIÓN]... [ [JUEGO] | PETICIÓN [FICHERO]... ]

Por lo que será necesario verificar que el comando lo tengamos instalado en nuestro Linux y de esta forma podremos continuar con nuestro comando de conversión de archivos:

1
2
find /proyecto/html \( -name "*.php" -o -name "*.html" -o -name "*.js" -o -name "*.css" \)  -exec recode -d ISO-8859-1..UTF-8 '{}' \;
find /proyecto/html \( -name "*.php" -o -name "*.html" -o -name "*.js" -o -name "*.css" \) -print | xargs perl -pi -e 's/iso-8859-1/utf-8/g'

En la linea 1 “find” buscará a partir del directorio “/proyecto/html” de forma recursiva todos los archivos con extensión php, html, js y css para aplicarles el recode.

En la linea 2 reemplazamos los textos que hagan referencia a “iso-8859-1” por “utf-8” ya que tengo algunos headers en las declaraciones de PHP y HTML. Por ejemplo:

header("Content-type:text/plain; charset=iso-8859-1");
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Con MySQL tenemos varias opciones, la primera, que a mi parecer es la más rápida pero no la más elegante es indicarle a la conexión de MySQL que queremos recibir datos en uft8 por medio de SET NAMES, por lo que en nuestra conexión, justo después de la selección de la base de datos insertamos la siguiente linea:

mysql_query ("SET NAMES 'utf8'");

Otra opción es usar la función mysql_set_charset

mysql_set_charset ('utf8', $conn);

Con esto, automágicamente MySQL envía los datos en la codificación seleccionada. Sin embargo quiero ir más allá, convertir toda la base de datos a utf8 y estandarizar de esta forma todo mi proyecto.

3
4
5
6
7
mysqldump -h localhost -u usuario -p --add-drop-table --create-options --extended-insert --routines db_proyecto > db_proyecto.sql
recode -d ISO-8859-1..UTF-8 db_proyecto.sql
perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' db_proyecto.sql
perl -pi -w -e 's/COLLATE=latin1_spanish_ci/COLLATE=utf8_general_ci/g;' db_proyecto.sql
mysql -u usuario -p db_proyecto < db_proyecto.sql

En la linea 3 realizo un respaldo de la base de datos en un archivo llamado “db_proyecto.sql”.

En la linea 4 realizamos la conversión del archivo a UTF-8.

En la linea 5 y 6 cambiamos dentro del archivo todo lo que sea “latin1” y “latin1_spanish_ci” por “utf8” y “utf8_general_ci” respectivamente.

Por último, en la linea 7 volvemos a incluir la base de datos con los cambios efectuados.

Después de hacer la conversión, mi proyecto quedó en perfectas condiciones, salvo por algunos detalles que son de bajo impacto y tiene que ver más con librerías muy especificas que no vale la pena comentar en este artículo.



Comentarios


Patrocinadores

Publicidad