Intermédiaire 8 min de lecture 25 janvier 2025

mb_detect_encoding en PHP : comprendre et bien l'utiliser

Accents qui s'affichent en �, JSON qui échoue, base de données remplie de ???. La détection d'encodage est au cœur de ces problèmes. mb_detect_encoding est l'outil PHP prévu pour ça, à condition de le configurer correctement et d'en connaître les limites.

Qu'est-ce que mb_detect_encoding ?

C'est une fonction de l'extension mbstring qui tente d'identifier l'encodage d'une chaîne à partir d'un ordre de détection.

Les points essentiels à connaître pour l'utiliser efficacement :

1 Fonctionnement et signature

Retourne le nom de l'encodage détecté ou false si rien n'est reconnu.

string|false mb_detect_encoding(string $string, array|string|null $encodings = null, bool $strict = false)

2 Ordre de détection

L'ordre des encodages influence fortement le résultat.

mb_detect_order(['UTF-8','Windows-1252','ISO-8859-1','ASCII']);

3 Encodages fréquemment rencontrés

Ceux qui posent souvent question en production :

UTF-8, UTF-16LE/BE
Windows-1252 (CP1252), ISO-8859-1/15
Shift_JIS (SJIS), EUC-JP
KOI8-R, CP1251

4 Limites et pièges

Pourquoi la détection peut se tromper :

ASCII ⊂ UTF-8 : chaînes 7 bits détectées comme ASCII
CP1252 vs ISO-8859-1 : ambiguïtés sur les mêmes octets
BOM (UTF-8/UTF-16) influence le résultat
Byte sequences invalides si strict=true → false

Problèmes classiques

Copier-coller depuis Word ou emails

Introduit du CP1252 détecté comme ISO-8859-1, provoquant des caractères erronés.

Tests unitaires instables

Résultats différents selon l'environnement si mb_detect_order varie.

Détection "ASCII" inattendue

Une chaîne 7 bits est vue comme ASCII alors que vous attendiez UTF-8.

JSON/DB qui cassent

"Malformed UTF-8" pendant json_encode ou des ??? en base faute de conversion.

Exemple de problème courant :

# Deux chaînes visuellement identiques mais encodées différemment
$stringUtf8 = "Café" # UTF-8
$stringCp1252 = "Caf\xE9" # CP1252
$enc1 = mb_detect_encoding($stringUtf8, ['UTF-8','CP1252','ISO-8859-1'], true)
$enc2 = mb_detect_encoding($stringCp1252, ['UTF-8','CP1252','ISO-8859-1'], true)
assert $enc1 === $enc2 # ❌ Faux, résultats différents → nécessite conversion

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Affichage de losanges � ou de ? à la place des accents
!
json_encode échoue avec "Malformed UTF-8 characters"
!
La base affiche ??? ou remplace les accents après insertion
!
"Headers already sent" à cause d'un BOM en tête de fichier
!
Votre éditeur propose de réouvrir le fichier avec un encodage différent

Comment détecter et valider l'encodage

Solution recommandée : mb_detect_encoding

mb_detect_encoding permet d'identifier l'encodage d'une chaîne. Configurez l'ordre de détection, activez le mode strict et combinez avec mb_convert_encoding pour fiabiliser vos flux.

✅ Ordre pertinent

Placez UTF-8 en premier, puis CP1252, ISO-8859-1, etc.

📊 Validation stricte

Utilisez strict=true pour rejeter les séquences invalides

🧹 Gestion du BOM

Détectez et retirez un BOM avant traitement si nécessaire

💾 Stratégie de repli

Prévoyez un encodage par défaut si la détection échoue

Autres méthodes de détection

Affichage de l'encodage dans l'éditeur

VS Code: "Reopen with Encoding", "Save with Encoding"
JetBrains: "File Encoding", "Transparent native-to-ascii conversion"

En ligne de commande (Unix)

# Détecter l'encodage d'un fichier
file -i fichier.txt
# Estimation par heuristique
uchardet fichier.txt
# Détection/validation multi-langues
enca -L none fichier.txt
# Vérifier UTF-8 valide
iconv -f UTF-8 -t UTF-8 -o /dev/null fichier.txt || echo "UTF-8 invalide"

En code

JavaScript (Node)

require('chardet').detect(require('fs').readFileSync('fichier.txt'))

Python

from charset_normalizer import from_bytes; from_bytes(data).best().encoding

Excel / Google Sheets

ENCODEURL(A1) · UNICODE(MID(A1;position;1))

Nettoyer et prévenir

🚀 Solution rapide avec mb_detect_encoding

Détectez l'encodage, puis convertissez vos données en UTF-8 avec mb_convert_encoding pour uniformiser l'application.

Détection fiable en mode strict
Conversion vers UTF-8
Suppression éventuelle du BOM

Méthodes techniques avancées

🔧 Normaliser

Standardisez tout en UTF-8 (idéalement UTF-8 sans BOM)
Retirez les BOM inutiles avant output
Uniformisez les fins de ligne (dos2unix, .gitattributes)

🧹 Filtrer

Validez les entrées: mb_detect_encoding($s, ['UTF-8'], true) puis convertissez
Utilisez mb_convert_encoding ou iconv pour re-encoder
Bloquez les séquences invalides et journalisez les corrections

⚙️ Automatiser

Hooks pre-commit refusant les fichiers non UTF-8
Connexion DB en utf8mb4 et collation cohérente
Entêtes HTTP "Content-Type; charset=UTF-8" contrôlés en CI

Checklist rapide

Fichiers et sorties en UTF-8 sans BOM
mbstring activé et mb_internal_encoding('UTF-8')
mb_detect_order défini et homogène (dev/CI/prod)
Base configurée en utf8mb4 et connexions initialisées
Tests vérifiant UTF-8 valide et conversions correctes
Documentation équipe sur encodages et entêtes HTTP

Conclusion

mb_detect_encoding est précieux, mais son efficacité dépend de l'ordre de détection, du mode strict et de la façon dont vous convertissez ensuite vos données.

Mettez en place une stratégie claire: détecter, valider, convertir vers UTF-8 et contrôler vos points d'entrée. Vous éliminerez la majorité des anomalies d'affichage et d'intégration.

Vérifiez vos encodages dès maintenant

Utilisez nos outils et bonnes pratiques pour détecter et normaliser l'encodage de vos textes et fichiers.

Vérifier mes encodages