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 deutf8mb4
- Table ou colonne MySQL en
latin1
ouutf8
au lieu deutf8mb4
- 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
- Connexion PHP en
- 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
- Utiliser
- 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
ouutf8mb4_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).