Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Le piège strlen() de PHP

Article posté le 30-08-2015 dans la catégorie PHP

C'est un petit (gros) piège qui passe souvent inaperçu. Juqu'au jour où... (les fameux schrodinbugs, désolé pour l'orthographe)

Venant en au fait. Beaucoup de codeurs en PHP vont utiliser la fonction strlen() pour mesurer la longueur d'une chaîne. Prenons l'exemple d'un script PHP, brut, sans rien d'autre que ceci:

echo strlen("eric") ; //Affichera 4

Jusque là, rien d'anormal. Maintenant, essayons ceci:

echo strlen("éric"); //Affichera 5

Et oui! La fonction strlen() affiche la longueur en octets! Par en caractères! Ainsi, si un caractère est codé sur deux octets, un problème va se poser!

Pour éviter ceci, il faut utiliser la méthode mb_strlen().

Il y a à présent deux cas de figure :

1) Vous connaissez le charset défini dans votre code, par exemple avec cette méthode :

mb_internal_encoding('utf-8');

vous aurez juste à faire ceci :

echo mb_strlen('éric'); //Affichera 4

2) Vous ne connaissez pas le charset, il faut donc le détecter avec la méthode mb_detect_encoding()

echo mb_strlen('éric', mb_detect_encoding('éric)); //Affichera 4

Et vouala!

NB : ne faites pas l'erreur de croire que d'utiliser la fonction header() vous protègera des problèmes. Pour rappel, celle-ci envoi un header au navigateur client, elle n'influe pas sur votre script!

NB2 : A partir de PHP 5.6, UTF-8 est utilisé par défaut!


Tweet
comments powered by Disqus