Supprimer les accents des caractères accentués
Posté dans PHP — 16 commentaires
Voilà un grand classique pour nous autres peuples de caractères : comment supprimer les accents des caractères accentués de notre sublime langue en utilisant PHP ? Mais avant de répondre à cette question, une autre se forme, insidieuse : pourquoi supprimer les accents des caractères accentués ? Voici quelques exemples envisageables :
- Transformer une chaine en URL plus facilement lisible :
"severite"au lieu de"s%C3%A9v%C3%A9rit%C3%A9" - Transformer une chaine pour obtenir un nom de fichier propre
- Pouvoir enfin ordonner les clés accentuées de nos tableaux associatifs PHP et ne plus retrouver
"événement"après"zéro"!
Solution toute nulle
C'est ce dernier exemple qui m'a conduit à rechercher une solution viable. En effet, malgré tous les efforts de Google je n'ai réussi à trouver que des exemples utilisant des remplacements de caractères du style :
<?php
$str = strtr($str, 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝ', 'AAAAAACEEEEEIIIINOOOOOUUUUY');
$str = strtr($str, 'áàâäãåçéèêëíìîïñóòôöõúùûüýÿ', 'aaaaaaceeeeiiiinooooouuuuyy');
?>
Évidement, ça a l'air sexy et simple, mais si comme moi vous travaillez en utf-8, les caractères accentués sont bien souvent encodés avec plus de 8bits (un caractère), mais jusqu'à 32bits. Ainsi, les techniques basées sur une substitution de caractères sont totalement obsolètes parce qu'elles produisent des résultats erronés. C'est triste, mais c'est vrai.
Solution pas mal
Comment faire alors ? Sommes nous condamnés par des siècles d'histoire ? Que nenni ! C'est en transformant d'anciens fichiers iso-8859-1 en utf-8 que la solution m'a sauté au visage : utiliser les entités échappées pour récupérer le caractère non accentué. En effet, "é" une fois échappé donne "é" et "É" donne "É". Ne reste plus alors qu'à gérer les cas particuliers comme la cédille ou les ligatures, et le tour et joué. Ainsi, Nous utilisons simplement htmlentities() pour échapper les caractères exotiques puis remplaçons les expressions échappées grâce à de savantes expressions régulières :
<?php
function wd_remove_accents($str, $charset='utf-8')
{
$str = htmlentities($str, ENT_NOQUOTES, $charset);
$str = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $str);
$str = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $str); // pour les ligatures e.g. 'œ'
$str = preg_replace('#\&[^;]+\;#', '', $str); // supprime les autres caractères
return $str;
}
?>
Trop fastoche !
Notez tout de même que je préfère supprimer les caractères échappés qui n'ont pas été traités. C'est pas la meilleure solution, mais c'est celle qui me va le mieux…
Et maintenant, que vais-je faire ?
Dans un prochain billet nous verrons comment utiliser cette fonction pour ordonner les clés accentuées d'un tableau associatif. Que d'aventures !! À la prochaine !