Base de connaissances

1 000 FAQ, 500 tutoriels et vidéos explicatives. Ici, il n'y a que des solutions !

Résoudre un problème d'encodage des pages

Ce guide s’adresse aux développeurs et webmasters rencontrant des problèmes d’affichage de caractères spéciaux (par exemple accents, caractères arabes, chinois, emojis, etc.), que ce soit sur un site Web Infomaniak ou dans sa base de données.

 

Préambule

  • Causes fréquentes des caractères mal affichés qui apparaissent à la place de caractères spéciaux ou d’emojis comme ??:
    • Connexion PHP en utf8 au lieu de utf8mb4
    • Table ou colonne MySQL en latin1 ou utf8 au lieu de utf8mb4
    • Fichier SQL encodé différemment du paramètre d'import
    • Fichiers HTML/CSS/JS mal encodés
    • Absence ou mauvaise déclaration du charset côté HTML, PHP ou HTTP
  • Solutions habituelles:
    • Utiliser utf8mb4 partout : base, connexions, tables, colonnes, fichiers, en-têtes
    • Valider l’encodage de tous les fichiers et dumps
    • Tester l’affichage des emojis, accents et autres caractères multilingues
  • Prenez également connaissance de cet autre guide pour forcer un autre encodage lors de la connexion à une base MySQL.

 

Utilisez un éditeur de texte qui supporte l’enregistrement en UTF-8 sans BOM (Visual Studio Code, Sublime Text, Notepad++...)

 

1. Utiliser UTF-8 ou UTF-8MB4 partout

L'encodage utf8 de MySQL ne supporte pas les caractères sur 4 octets, comme les emojis. Ceux-ci s’afficheront en ??. Il faut donc utiliser utf8mb4, qui est une véritable implémentation complète de UTF-8.

 

2. HTML – Déclaration correcte de l'encodage

Dans le <head> de vos pages HTML :

<meta charset="UTF-8">

Assurez-vous aussi que les fichiers CSS/JS sont enregistrés en UTF-8 (sans BOM). 

 

3. PHP – Forcer UTF-8 ou UTF-8MB4

a) En-têtes HTTP

header('Content-Type: text/html; charset=utf-8');

b) Connexion MySQL (API MySQL)

$connection = mysql_connect($host, $user, $pass);
mysql_set_charset('utf8mb4', $connection);

c) Connexion 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 données MySQL

a) Configuration dans phpMyAdmin

  • Base de données, tables, et colonnes doivent être en utf8mb4_unicode_ci ou utf8mb4_general_ci.
  • Dans l'onglet Opérations, choisissez utf8mb4_unicode_ci pour la collation.

b) Commandes SQL utiles

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) Après la connexion PHP

mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");

 

5. Fichier .user.ini / .htaccess 

Pour forcer l'encodage côté serveur (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. Import / export de dumps SQL

Les erreurs comme é devenant ? ou un emoji ☺ devenant ?? proviennent souvent d’un désalignement d’encodage.

Vérifiez l’encodage du fichier SQL avant import. Utilisez iconv si nécessaire :

iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sql

Dans phpMyAdmin, précisez l'encodage d’import (par exemple UTF-8, UTF-8MB4 ou latin1 selon le fichier).


Cette FAQ a été utile?