Base de conocimientos

1 000 FAQ, 500 tutoriales y vídeos explicativos. ¡Aquí sólo hay soluciones!

Resolver un problema de codificación de páginas

Esta guía está dirigida a desarrolladores y webmasters que encuentran problemas de visualización de caracteres especiales (por ejemplo acentos, caracteres árabes, chinos, emojis, etc.), ya sea en un sitio web de Infomaniak o en su base de datos.

 

Preámbulo

  • Causas frecuentes de caracteres mal visualizados que aparecen en lugar de caracteres especiales o emojis como ??:
    • Conexión PHP en utf8 en lugar de utf8mb4
    • Tabla o columna MySQL en latin1 o utf8 en lugar de utf8mb4
    • 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
  • 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
  • También consulte esta otra guía para forzar otra codificación al conectarse a una base de datos MySQL.

 

Use 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 de la codificación

En el <head> de sus páginas HTML:

<meta charset="UTF-8">

Asegúrese también de que los archivos CSS/JS estén guardados 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 o utf8mb4_general_ci.
  • En la pestaña Operaciones, elija utf8mb4_unicode_ci para la codificació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 lado del 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. Importar / exportar volcados SQL

Los errores como é convirtiéndose en ? o un emoji ☺ convertiéndose en ?? suelen deberse a un desajuste de codificación.

Verifique la codificación del archivo SQL antes de importar. Use 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).


¿Le ha sido útil esta FAQ?