Archives par étiquette : mb_strlen

PHP : strlen vs mb_strlen

De l’utilisation dévoyée de strlen

Une erreur communément faite par nombre de développeurs PHP consiste à se servir de strlen pour mesurer la longueur d’une chaîne de caractères. Mais gare ! Car, même si la documentation PHP est quelque peu ambiguë à ce sujet, il est toutefois fait mention du fait suivant :

strlen() retourne le nombres d’octets plutôt que le nombre de caractères dans une chaîne.

Pour des chaînes de caractères ASCII (codées sur un octet – 7 bits, en réalité), pas de problèmes particulier, comme vous le constatez :

strlen

Attention toutefois, les espaces sont aussi des caractères ! Vous pouvez appliquer trim au besoin pour élaguer les espaces (avant et après, pas au milieu de votre châine de caractères !)

strlen-espace

Photo d'un ruban à mesurer

La taille, ça compte !


Là où les choses se corsent quelque peu, c’est lorsque votre chaîne de caractères est susceptible de contenir des caractères codés sur plus d’un octet…

strlen-utf8

La fonction strlen me renvoie 10…elle ne compte pas les caractères (il y en a 9 !) mais les octets nécessaires pour représenter notre chaîne de caractères ! Attention donc aux étourdis qui pensent compter le nombre de caractères, vous faites fausse route ! Mon caractère accentué compte pour deux, mais deux octets…et non deux caractères !

mb_strlen à la rescousse !

Avant de voir ce que donnerait mb_strlen appliquée à notre exemple, tâchons de voir quel codage de caractères nous avons par défaut :
strlen-internal-encoding

Par défaut, notre jeu de caractères est donc latin1. Si nous utilisons mb_strlen sans préciser le jeu de caractères que nous ciblons, le résultat sera le même qu’en utilisant strlen, et ça, nous n’en voulons pas.

Voyons quel est le jeu de caractères de notre chaîne, même si nous nous en doutons un peu ! 😉
7

Nous y voilà donc ! Notre chaîne est codée en UTF-8. Cette information est capitale si nous souhaitons utiliser mb_strlen correctement. Voici donc l’appel à cette fonction tel qu’il doit être fait pour fonctionner :

7

La fonction mb_strlen nous renvoie bien 9, qui est bien le nombre de caractères de notre chaîne !

Attention, le type de retour de mb_strlen est mixed, ce qui signifie que la fonction renvoie plusieurs types :

  • Dans le cas où elle s’exécute correctement, elle renvoie bien le nombre de caractères selon le codage que vous avez choisi (ou celui par défaut)
  • Dans le cas où elle échoue, elle renvoie le booléen false

Faites donc attention à utiliser la triple égalité (en valeur et en nombre). Si vous passez un codage invalide, la fonction vous renverra false et un Warning. Attention cependant pour les petits malins qui abusent du @ pour cacher les erreurs sous le tapis :
+strlen-badencoding

Que votre chaîne soit vide ou que vous mentionniez un codage invalide, avec une égalité simple (non stricte), le résultat sera le même.