Con esto nos hemos pegado todos los que trabajamos con PHP.
El problema viene dado por 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).
El cotejamiento (esta palabra tan rara) indica qué tipo de codificación queremos usar para los valores de estos campos.
Busqué y busqué, probé y probé y al final me hice un pequeño esquema con lo que yo hago para solucionarlo.
Al crear la base de datos MySQL, asegúrate que los campos string y demás esten en utf8_spanish_ci y el cotejamiento de las tablas en utf_unicode_ci
ejemplo:
CREATE TABLE IF NOT EXISTS `table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
`autotimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Si usas phpMyAdmin se puede modificar en el apartado «Operaciones» de la tabla.
En las páginas de nuestra web, también hay que indicar el conjunto de caracteres que queremos usar.
Coloca en el <head>
de todos los archivos HTML:
<meta charset="UTF-8">
Y en los que únicamente llevan PHP (llamadas de AJAX, APIs, XML, …) colocar en la primera linea el siguiente código:
header("Content-Type: text/html;charset=utf-8");
Yo estoy usando MySQLi, así que te indico lo que yo hago
$mysqli = new mysqli($BD_SERVIDOR, $BD_USUARIO, $BD_PASSWORD, $BD_NOMBRE);
$mysqli->set_charset("utf8");
Pero si utilizas mysql_connect (aunque esta extensión fue declarada obsoleta en PHP 5.5.0 y eliminada en PHP 7.0.0.) debes incluir también mysql_set_charset, que te permite establecer el conjunto de caracteres del cliente.
$conn = mysql_connect($BD_SERVIDOR, $BD_USUARIO, $BD_PASSWORD);
mysql_set_charset("UTF8", $conn);
Tanto $BD_SERVIDOR, $BD_USUARIO, $BD_PASSWORD, $BD_NOMBRE son variables donde yo guardo la configuración de mi base de datos
Con esto he solucionado el engorroso problema de los acentos y las eñes, y me evito usar el htmlentities