problema mysql + php + utf-8
¡Atención entrada técnica fuera de la linea editorial! Pero después de lo que me ha costado encontrar la solución dejo esto aquí por sí le pasa a alguien no tenga que dar vueltas por la red sin encontrar solución.
Problema: Una web realizada con PHP + mysql utilizando la codificación UTF-8 muestra letras raras cuando tiene que poner acentos, eñes y símbolos no ingleses.
El escenario es el siguiente: La base de datos almacena tablas con campos tipo texto los cuales se almacenan codificados en utf-8. El fichero php realiza la consulta mediante una sentencia mysql_query(), los datos se recogen en un array, pero si lo mostramos por pantalla mediante un print_r() vemos que las letras acentuadas o caracteres no ingleses se nos muestran con caracteres ininteligibles.
La solución se debe tomar por varios caminos:
1.- Verificar que la configuración del Apache en Apache.conh o .htaccess tenga configurado el DefaultCharSet a UTF8. Esta es la codificación en la que el servidor devuelve las páginas a los clientes, si estáis en un hosting compartido, modificando el fichero .htaccess debería valer.
2.- Codificar los ficheros en UTF-8. La mayor parte de las veces la solución pasa por utilizar un editor decente y gratuito como Geany, Notepad++, etc.. En cualquiera de estos podemos elegir el formato en el cuál queremos grabar nuestros ficheros. No el nombre, si no el modo en el que se codifican. Para ello deberemos grabar nuestros ficheros de código PHP y html en formato UTF8 sin BOM.
3.- Indicar como queremos recibir los datos de la base de datos. Por defecto MYSQL no devuelve los datos con la codificación UTF8, por los que es la propia base de datos la que nos da los datos en un formato incorrecto en nuestro caso. ¿cómo solucionamos esto? Tan sencillo como añadir la siguiente línea delante de cada mysql_query():
$result = mysql_query(“set names ‘utf8′”
;
Mi problema era el tercero y después de horas malgastadas buscando el maldito error he llegado de pura casualidad hasta este comentario de la documentación de Php que me ha dado la solución. Me parece increíble que sea un problema tan mal documentado.
Comentarios desactivados