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.
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.
Publicado el 6 de marzo de 2010 en


06/03/2010 a las 7:31 am
[...] http://www.developarts.com/convertirde-iso-8851-1-a-utf-8/ AKPC_IDS += "3461,"; [...]
08/07/2010 a las 8:54 am
[...] no me resultaba práctico hacerlo uno por uno, entonces le pedí ayuda a google y encontre unos scripts bastantes prácticos en la página de developarts. Primero que nada hay que instalarnos el paquete [...]
18/02/2011 a las 1:51 pm
Ayuda Nexus, como le puedo hacer para resolver el siguiente escenario:
Tengo una base de datos en SQL Server 2005 (servidor remoto) y estoy tomando datos de una tabla de esa base, ya que tengo esa info hago un proceso en mi script en PHP y de ahi inserto en my base local en Mysql, pero me aparecen caracteres raros , por ejemplo en los acentos…? que me sugieres.
Gracias por la ayuda
20/02/2011 a las 12:11 am
Hola Jamber:
Si estás usando PHP, te recomiendo que intentes guardar los datos jugando con las funciones utf8_encode y utf8_decode
Seguramente te serán de ayuda.
Saludos