MacBook avec code sur un bureau

PHP – mb_strlen pour retrouver la taille d’une chaîne de caractère et non strlen

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é'); // 4

La 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*.

À lire aussi