Supprimer les accents UTF8 avec PHP
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… 🙂
https://blog.lecacheur.com/2008/04/08/supprimer-les-accents-utf8-avec-php/DéveloppementphpIl 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 : Ce bout de code...SeBSébastien LECACHEUR23r0@laposte.netAdministratorLe weblogue de SeB
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
Merci Michel pour cette solution. Je vais essayer de la tester. 😉
Après 3 heures de recherche, je tombe sur ce post qui me sauve.
Je peux enfin passer à la suite. Enorme merci.
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
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’
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…
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 ?
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 !
Aaah enfin merci beaucoup, ça m’a aidé à 100% après 30min de recherches infructueuses!
Bonjour,
Réaction tardive sur un vieux sujet. strtr fonctionne octet par octet, à condition bien sûr que tous les arguments soient dans le même codage, soit par exemple :
$ch= strtr(utf8_decode($ch), utf8_decode(‘àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ’), utf8_decode(‘aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY’));
Sans le utf8_decode des arguments 2 et 3, le fonctionnement dépendra du codage de votre fichier source.
J’ai conçu une fonction qui travaille sur la valeur héxadécimale du caractère, en comparant avec un tableau indexé par des valeurs héxadécimales et contenant les correspondances ASCII.
C’est peut-être plus puissant dans la mesure où l’on peut décider soi-même les caractères que l’on veut remplacer, et par quoi les remplacer…
la fonction met 5 centièmes de secondes pour une chaîne de lorem ipsum avec accents d’environ mille caractères, je ne sais pas ce que ça vaut, et autre avantage, elle retourne les index où la longueur du caractère est différente après traitement i.e. pour php les caractères utf occasionnent souvent une longueur différente de
1.
Si quelqu’un la veut, je ne sais pas trop où poster cela… c’est plutôt long à cause du tableau donc je ne voudrais pas polluer…
GIBI, un grand merci pour la solution, exactement ce que je cherchais !
Bonsoir,
Merci pour cette solution qui fonctionne parfaitement
Bonjour!
Oo ça marche! enfin!!
un grand merci =))
Juste une petite question au demeurant… comment on fait pour retirer les espaces? est ce que c’est possible?
Jusque là j’utilisais strtr($name, array()); pour changer l’insertion des noms de photos qui entraient dans la bdd… c’était paaaaarfait, ça fonctionnait très bien, jusqu’à ce que ça ne marche plus… comme ça, un beau matin… genre ce matin -_-
merci d’avance!
oh c’est bon j’ai trouvé! merci quand même!
$str= preg_replace(‘/\s\s+/’, », $str); // supprime les doubles espaces
$str= preg_replace(‘/\s/’, », $str); // supprime les espaces simples
(je savais pas comment tout mettre sur la même ligne…)
Merveilleux!!!!
Merci 😉
Moi je cherche encore. Mon problème est de supprimer les émoticones ajoutées parfois par mes auteurs dans des recettes de cuisine…
Ça par exemple :