Después de algún tiempo con la web un tanto abandonada, hoy voy a dejar aquí a modo de apunte para una web que «se supone» que tengo que entregar a final del mes que viene. Cómo esta web tendré que hacerla con una base de datos y el tema que ocupa este post no es la primera vez que me pasa (siempre cometo los mismos errores en las mismas cosas en este aspecto … lo sé). Muchas veces al crear una web con PHP y MySQL, de repente te encuentras con el problema al introducir y mostrar los datos, ya que estos se alteran sin venir a cuento para terminar apareciendo en pantalla algo como áóñ y cosas parecidas. Las primeras veces que me ocurrió, volvía a empezar a las web que me tenía ocupado (que cuando aprendes por tu cuenta, en muchas ocasiones lo más sencillo acaba siendo desandar el camino andado), pero con el paso del tiempo, cuando me volvía a pasar comencé a toquetear cosas, cambiar charsets y traducir a ñ
;
, á
o funciones que no hacían exactamente lo que esperaba que hiciesen.
Tiempo después caí en la cuenta de que el problema es que la configuración del cotejamiento de los caracteres especiales como acentos, eñes y demás símbolos, no es el mismo entre la base de datos (MySQL), el lenguaje de servidor (PHP) y el servidor (Apache). Así que como buen autodidacta empecé a buscar un poco sobre el tema y después de encontrar comentarios buenísimos y post sobre el tema que pululan por la red, me he decidido a hacer un resumen de todo lo necesario para cada vez que nos ocurra un problema de este estilo (no es necesario llevar a cabo todos los pasos para que funcione correctamente, depende del entorno en el que cada cual se encuentre, por eso es buena idea que si algún usuario sigue este pequeño listado de consejos, compruebe después de cada paso si ya se ha solucionado el problema). He de decir que a mi todos los «consejos» que aquí voy a escribir, me han solucionado el problema de los acentos y las eñes en uno u otro momento..
Cómo solucionar con estos pequeños apuntes el problema de los acentos y las eñes mediante UTF-8
- Cotejamiento
Al crear la base de datos MySQL, asegúrate que los campos string y demás estén en utf8_spanish_ci y el cotejamiento de las tablas en utf_unicode_ci (más tarde se puede cambiar en Operaciones> Cotejamiento en el phpMyAdmin) - Content type HTML
Pon entre el <head> y </head> de todos los archivos HTML:<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
- Content type PHP
Si queremos poner en utf8 un solo campo podremos hacerlo medianteutf8_encode o utf8_decode.
En caso de que lo que queramos es codificar toda la página en los archivos puramente PHP (que muestran XML, llamadas de AJAX, APIs…) pon en alguna parte el código:header("Content-Type: text/html;charset=utf-8");
- Set names
Al crear la conexión de PHP con MySQL, envía esta consulta justo tras la conexión (para que los nombre sean UTF-8):<strong>mysql_query("SET NAMES 'utf8'");</strong>
Para MySQLi escribe
$acentos = $db->query("SET NAMES 'utf8'")
- Convertir codificado a UTF-8
Convierte todo lo que esté codificado de latin1 a UTF-8 con esta sentencia:SELECT convert(cast(convert(content using latin1) as binary) using utf8) AS content
- Apache
Quita el DefaultCharset del Apache o modifícalo - htmlentities
Como última y desesperada opción, quita todos los htmlentities(); y sustitúyelo por otro parser para ‘sanitizar’ los datos.
Estos solo son algunos pequeños apuntes que a mi me han servidor en algún momento (y que a día de hoy sigo utilizando con un 100% de eficacia), pero seguro que no son los únicos que existen, por lo que el día que descubra más, supongo que los añadiré a esta pequeña lista. Para más información, siempre nos quedará gOOgle e informarnos sobre la mejor manera de utilizar los caracteres UTF-8.
2 Comentarios
Perfecto!! me ha venido genial
Me alegro de que te viniese bien … gracias por la visita.