Beaucoup de code utilise strlen pour récupérer la taille d’une chaîne de caractères. Le problème : strlen retourne le nombre d’octets, pas le nombre de caractères. Dès qu’une chaîne contient des lettres accentuées ou des emojis, le résultat est faux.
Le problème avec strlen
En UTF-8, un caractère comme « é » occupe deux octets. strlen les compte donc comme deux :
echo strlen('café'); // 5 (et non 4)
echo mb_strlen('café'); // 4La solution : mb_strlen
La fonction mb_strlen, fournie par l’extension mbstring, tient compte de l’encodage et retourne le vrai nombre de caractères :
mb_strlen($chaine, 'UTF-8');
Précisez toujours l’encodage en second argument. Sans lui, mb_strlen utilise l’encodage interne de PHP, qui n’est pas forcément celui de votre chaîne.
À éviter
On voyait parfois cette astuce pour compenser :
strlen(utf8_encode($chaine));
Ne l’utilisez plus : utf8_encode() est déprécié depuis PHP 8.2 et voué à disparaître. mb_strlen fait le travail proprement, en un seul appel.
Pour aller plus loin
L’extension mbstring propose tout un jeu de fonctions équivalentes qui gèrent l’encodage : mb_substr, mb_strtoupper, mb_strpos, etc. Dès que vous manipulez du texte susceptible de contenir de l’UTF-8, préférez-les à leurs équivalents str*.
