1000 FAQ, 500 tutoriales y vídeos explicativos. ¡Aquí sólo hay soluciones!
Resolver un problema de codificación de las páginas
Esta guía está dirigida a desarrolladores y webmasters que tienen problemas para mostrar caracteres especiales (por ejemplo, acentos, caracteres árabes, chinos, emojis, etc.), ya sea en un sitio web Infomaniak o en su base de datos.
Prólogo
- Causas frecuentes de caracteres mal mostrados que aparecen en lugar de caracteres especiales o emojis como
??
:- Conexión PHP en
utf8
en lugar deutf8mb4
- Tabla o columna MySQL en
latin1
outf8
en lugar deutf8mb4
- Archivo SQL codificado de manera diferente al parámetro de importación
- Archivos HTML/CSS/JS mal codificados
- Ausencia o mala declaración del charset en HTML, PHP o HTTP
- Conexión PHP en
- Soluciones habituales:
- Usar
utf8mb4
en todas partes: base, conexiones, tablas, columnas, archivos, encabezados - Validar la codificación de todos los archivos y volcados
- Probar la visualización de emojis, acentos y otros caracteres multilingües
- Usar
- Tenga también en cuenta esta otra guía para forzar otro codificación al conectarse a una base de datos MySQL.
Utilice un editor de texto que soporte el guardado en UTF-8 sin BOM (Visual Studio Code, Sublime Text, Notepad++...)
1. Usar UTF-8 o UTF-8MB4 en todas partes
La codificación utf8
de MySQL no soporta caracteres de 4 bytes, como los emojis. Estos se mostrarán como ??
. Por lo tanto, debe usar utf8mb4
, que es una implementación completa real de UTF-8.
2. HTML – Declaración correcta del codificación
En la sección <head>
de sus páginas HTML:
<meta charset="UTF-8">
Asegúrate también de que los archivos CSS/JS se guarden en UTF-8 (sin BOM).
3. PHP – Forzar UTF-8 o UTF-8MB4
a) Encabezados HTTP
header('Content-Type: text/html; charset=utf-8');
b) Conexión MySQL (API MySQL)
$connection = mysql_connect($host, $user, $pass);
mysql_set_charset('utf8mb4', $connection);
c) Conexión PDO
$dsn = "mysql:host=localhost;dbname=ma_base;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
4. Base de datos MySQL
a) Configuración en phpMyAdmin
- La base de datos, las tablas y las columnas deben estar en
utf8mb4_unicode_ci
outf8mb4_general_ci
. - En la pestaña Operaciones, elija
utf8mb4_unicode_ci
para la collación.
b) Comandos SQL útiles
ALTER DATABASE ma_base CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE ma_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
c) Después de la conexión PHP
mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");
5. Archivo .user.ini / .htaccess
Para forzar la codificación en el servidor (Apache):
AddDefaultCharset utf-8
Header set Content-Type "text/html; charset=utf-8"
# Pour PHP
php_value default_charset UTF-8
php_value mbstring.internal_encoding UTF-8
6. Importación / exportación de volcados SQL
Los errores como é
convirtiéndose en ?
o un emoji ☺ convirtiéndose en ??
suelen ser el resultado de un desajuste de codificación.
Verifica la codificación del archivo SQL antes de importar. Usa iconv
si es necesario:
iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sql
En phpMyAdmin, especifique la codificación de importación (por ejemplo UTF-8
, UTF-8MB4
o latin1
según el archivo).