Intermédiaire 8 min de lecture 25 janvier 2025

PHP mbstring : manipuler correctement les chaînes UTF-8 en PHP

Accents qui sautent, emojis tronqués, comparaisons douteuses, compteurs de caractères faux. Dès qu’un texte dépasse l’ASCII, les fonctions classiques de PHP montrent leurs limites. L’extension mbstring apporte les outils nécessaires pour travailler proprement en UTF-8.

Qu’est-ce que mbstring en PHP ?

C’est une extension qui rend les fonctions de manipulation de chaînes multioctets fiables, notamment pour l’UTF-8.

Voici les notions clés à connaître pour bien utiliser mbstring :

1 Chaînes monooctet vs multioctets

Un caractère peut occuper plusieurs octets en UTF-8. Les fonctions ASCII ne le savent pas.

ASCII (1), UTF-8 (1 à 4), ISO-8859-1 (1)

2 Encodages pris en charge

mbstring sait travailler avec plusieurs encodages et convertir entre eux.

UTF-8, ISO-8859-1, SJIS, EUC-JP, UTF-16, UTF-32

3 Fonctions mbstring essentielles

Les incontournables pour longueur, découpe, recherche et conversion :

mb_strlen(), mb_substr(), mb_strpos(), mb_strtolower()
mb_convert_encoding(), mb_detect_encoding()
mb_check_encoding(), mb_substr_count()
mb_regex_encoding(), mb_ereg()

4 Configuration et paramètres

Définissez un encodage cohérent pour tout le projet :

mb_internal_encoding("UTF-8")
mb_http_output("UTF-8"), default_charset = "UTF-8"
mb_regex_encoding("UTF-8")
extension=mbstring dans php.ini

Problèmes classiques

strlen()/substr() sur des caractères accentués

Retourne une longueur fausse ou coupe au milieu d’un caractère. Utilisez mb_strlen()/mb_substr().

Tests unitaires qui échouent

Comparaison de chaînes identiques visuellement mais différentes en octets (émoticônes, lettres combinées).

trim() ou regex sans indicateur /u

Les classes \w, \s et . ne se comportent pas comme prévu sans mode Unicode.

Regex \s ou \w incomplètes

Activez PCRE en Unicode (/u) et alignez mb_regex_encoding() sur UTF-8.

Exemple de problème courant :

# Deux chaînes visuellement identiques mais différentes en octets
$s1 = "café";
$s2 = "café" # e + U+0301 (accent combinant);
strlen($s1) === strlen($s2) # ❌ Faux négatif
mb_strlen($s1, "UTF-8") === mb_strlen($s2, "UTF-8") # ✅ Vrai

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Des emojis ou accents s’affichent sous forme de losange � ou de ?
!
substr() coupe un caractère au milieu, rendant un JSON invalide
!
"Malformed UTF-8 characters" dans json_encode() ou preg_replace()
!
Comparaisons et tris incohérents entre chaînes accentuées
!
Différence entre strlen() et affichage apparent côté UI

Comment les détecter

Solution recommandée : mbstring en PHP

Activez mbstring et validez systématiquement l’encodage de vos données. Utilisez mb_check_encoding() et mb_detect_encoding() pour identifier l’encodage, puis mb_convert_encoding() pour uniformiser en UTF-8.

✅ Détection d’encodage

mb_detect_encoding(), mb_check_encoding() sur vos flux entrants

📊 Analyse fiable

Longueur, découpe et recherche conscientes des caractères multioctets

🧹 Conversion

mb_convert_encoding() pour normaliser en UTF-8

💾 Sortie cohérente

mb_http_output("UTF-8") et en-têtes corrects côté HTTP/DB

Autres méthodes de détection

Affichage dans l'éditeur

Activez l’affichage des codes Unicode et de l’encodage du fichier
Extensions “Render Whitespace”, “Hex Editor”, “Show Unicode”

En ligne de commande (Unix)

# Détecter l’encodage présumé
file -i fichier.txt
# Valider UTF-8 (échec si octets invalides)
iconv -f utf-8 -t utf-8 fichier.txt > /dev/null || echo "UTF-8 invalide"
# Repérer des octets non-ASCII
grep -P "[^\x00-\x7F]" -n fichier.txt
# Vérifier via PHP + mb_check_encoding
php -r '$c=file_get_contents("fichier.txt"); var_dump(mb_check_encoding($c,"UTF-8"));'

En code

JavaScript

Array.from(str).map(c => c.codePointAt(0).toString(16))

Python

s.encode("utf-8").decode("utf-8"); [f"U+{ord(c):04X}" for c in s]

Excel / Google Sheets

CODE(MID(cellule;position;1))

Nettoyer et prévenir

🚀 Solution rapide avec mbstring

Avant d’écrire des algorithmes complexes, utilisez mbstring partout où c’est pertinent :

Détection d’encodage
Découpe et recherche sûres
Conversion uniforme en UTF-8

Méthodes techniques avancées

🔧 Normaliser

Uniformisez en UTF-8 avec mb_convert_encoding()
Évitez les BOM UTF-8 et fixez default_charset="UTF-8"
Si besoin, normalisez la forme Unicode (intl Normalizer, NFC/NFKC)

🧹 Filtrer

Créez une fonction mb_trim() avec regex Unicode (/u)
Remplacez les espaces non standards et homogénéisez les sauts de ligne
Bloquez ou échappez les octets invalides avant stockage

⚙️ Automatiser

Hooks pre-commit: refuser des fichiers hors UTF-8 et vérifier mbstring activé
Tests: mb_check_encoding() sur les inputs & sorties
CI: valider JSON/CSV UTF-8 et activer PCRE Unicode

Checklist rapide

Fichiers en UTF-8 sans BOM
mbstring activé et encodage interne sur UTF-8
Fonctions mb_* utilisées pour longueur, découpe et recherche
Regex en mode Unicode (/u) et classes Unicode \p{...}
Contrôles automatiques des encodages en CI et en entrée utilisateur
Documentation interne sur l’usage de mbstring et UTF-8

Conclusion

L’extension mbstring rend vos traitements texte fiables dès que l’Unicode entre en jeu.

Uniformisez l’encodage en UTF-8, utilisez les fonctions mb_*, activez le mode Unicode en regex et éliminez une grande partie des erreurs liées aux chaînes.

Vérifiez votre manipulation de chaînes avec mbstring

Adoptez les fonctions mb_* et une configuration UTF-8 cohérente pour éviter les bugs de texte.

Mettre mes chaînes au niveau