RSS Feed

Supprimer les accents UTF8 avec PHP

8 April 2008 par SeB 9 commentaires »

Il est souvent utile de supprimer les accents des caractères accentués dans une chaîne. Cette action est utilisée par exemple pour générer une URL propre ou bien un nom de fichier qui ne posera pas de problème.

En PHP, le développeur retrouve souvent la solution  suivante :

$str = strtr($str, ‘ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝ’, ‘AAAAAACEEEEEIIIINOOOOOUUUUY’);
$str = strtr($str, ‘áàâäãåçéèêëíìîïñóòôöõúùûüýÿ’, ‘aaaaaaceeeeiiiinooooouuuuyy’);

Ce bout de code fonctionne très bien en IS0-8859-1. Cependant, avec une chaîne en UTF8, des caractères étranges vont s’immiscer. Cela vient du fait que les caractères sont encodés sur 8 bits.

Après maintes essais avec iconv() et autres strtr(), je n’ai pas trouvé de solution à ce problème. Heureusement, Olivier Laviale a trouvé une astuce. Je ne suis pas convaincu que ce soit la méthode la plus performante, mais elle a le mérite de fonctionner :

$str = htmlentities($str, ENT_NOQUOTES, ‘utf-8′);
$str = preg_replace(‘#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#’, ‘\1′, $str);
$str = preg_replace(‘#\&([A-za-z]{2})(?:lig)\;#’, ‘\1′, $str);
$str = preg_replace(‘#\&[^;]+\;#’, ”, $str);

Je vous laisser consulter le billet original d’Olivier sur le sujet si vous souhaitez avoir plus d’informations.

Ah ! Les joies de l’encodage… :-)

 

9 réactions sur “Supprimer les accents UTF8 avec PHP”

  1. michel says:

    Bonjour,

    Ayant le même problème, (j’avais aussi essayer avec utf8_decode), je viens de trouver cette solution qui fonctionne.
    http://www.developpez.net/forums/showthread.php?t=284411
    Apparemment, strtr travaille directement sur les octet au contraire de str_replace.
    Michel

  2. SeB says:

    Merci Michel pour cette solution. Je vais essayer de la tester. ;-)

  3. CauxMika says:

    Après 3 heures de recherche, je tombe sur ce post qui me sauve.
    Je peux enfin passer à la suite. Enorme merci.

  4. werutzb says:

    Hi!

    I want to extend my SQL experience.
    I red so many SQL books and want to
    read more about SQL for my position as db2 database manager.

    What would you recommend?

    Thanks,
    Werutz

  5. habib says:

    pardon, cette foction ne sert à rien, j’essayé des heures et des heures mais j’ai pas le resulta que je veux, et c’est vraiment simple ce que je veux: remplacer ‘é’ dans le mot ‘musée’,j’utilise cette fonction et j’obtient tjrs ‘musée’

  6. SeB says:

    werutzb,

    Sorry, I have no references to recommend.

    habib,

    Peut-être que l’astuce ne fonctionne pas dans ton cas précis mais je peux t’assurer que ça fonctionne en principe. Tu as peut-être un problème autre que l’encodage de ta chaine…

  7. Sun Location says:

    Bonjour,

    Je souhaiterais remplacer le caractère Š (S avec caron : c’est un caractère croatien) par un s sans accents, cependant, strtr ne semble pas le reconnaître.

    Existe-t-il une solution ?

  8. Beniguane says:

    Idem que CauxMika
    Après quelques heures d’utilisation de str_replace et strtr sans y parvenir, j’ai enfin réussi à décoder proprement ce que je voulais.
    Merci !

  9. Gauth says:

    Aaah enfin merci beaucoup, ça m’a aidé à 100% après 30min de recherches infructueuses!

Réagissez