PHP: strtolower et UTF-8
12.03.2009 Tags: PHP,tutoriel,English version available here! J'ai une petite fonction me permettant de formater selon mes besoins une chaine de caractères. Je l'utilise principalement pour de l'URL rewriting afin de mettre la chaine en minuscules, remplacer les espaces par des '-', éviter les accents etc...Pour celà j'utilise au début de ma fonction le simple mais efficace strtolower():
<?php
function urlrewrite($chaine) {
$chaine = strtolower($chaine);
...
}
?>
En travaillant en charset utf-8, j'ai remarqué qu'un texte de type '2ème TEST' passé dans cette fonction nous renvoie un magnifique 2�me test... pas vraiment ce que je voulais.
En farfouillant sur php.net, il est dit que strtolower() se base sur le charset défini dans les locales. En gros, que votre charset soit en utf-8 ou pas, strtolower() s'en fiche et ira piocher le charset dans les locales. Vous avez donc de grandes chances qu'il utilise le charset ISO-8859-1, voire ASCII et qu'il ne convertisse que ces caractères-là.
Bon, et maintenant? Il y a plusieurs solutions.
La première serait de convertir la chaine d'utf-8 en charset local, faire un strtolower(), puis reconvertir le tout en utf-8 ainsi:
<?php
function strtolower_utf8($chaine) {
$resultat = utf8_decode($chaine);
$resultat = strtolower($resultat);
$resultat = utf8_encode($resultat);
return $resultat;
}
?>
Ca marche, mais ce n'est pas des plus... sexy.
Autre solution: utiliser la fonction mb_strtolower(). Elle permet également de mettre tous les caractères en minuscules, mais il nous donne la possibilité de définir également l'encodage des caractères!
Ainsi, avec une fonction beaucoup plus légère, nous obtiendrons le même résultat:
>?php
function strtolower_utf8($chaine) {
$chaine = mb_strtolower($chaine,'UTF-8');
}
?>
Ajouter un commentaire
Commentaires
ling
24.10.2010, 21:06:35
Merci beaucoup pour ces infos ;)
deebo
23.04.2011, 11:24:03
Pertinent, c'est ce que je cherchais ... apparement un LOWER() mysql pourrait etre une autre alternative si mb_strtolower n'est pas activée ...
Astanos
26.04.2011, 13:45:37
Tout à fait, mais utile uniquement si tu vas chercher tes données dans une base de données, ce qui n'est pas toujours le cas ;)




