Supprimer les accents en PHP
Par Keul le jeudi, 21 octobre 2010, 14:05 - Lien permanent
S'il y a bien un truc embêtant en informatique, c'est la gestion des caractères. Vous connaissez ASCII, qui est un standard qui dit que par exemple, que "A" correspond à "1000001" histoire que les ordinateurs qui n'utilisent que des 0 et 1 puissent travailler avec.
Sauf que sur terre, on ne parle pas qu'anglais et que des caractères, il y en a un paquet dont une infime partie est gérée par ASCII. Vu que les autres standards de correspondance entre les caractères ne permet pas de mélanger des caractères facilement, on a crée utf-8 qui permet de gérer un grand nombre de caractères. Manque de bol, il faudra attendre PHP6 pour qu'il soit géré nativement.
En attendant que PHP6 sortes, pour convertir un texte UTF-8 en minuscules :
$texte=mb_strtolower($texte, 'UTF-8');
Et une méthode efficace pour supprimer les accents avec un texte UTF-8 (le script PHP doit être encodé en UTF-8!) :
$search =explode(',','á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ');
$replace=explode(',','a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y');
$texte= str_replace($search,$replace,$texte);
Et pour un nom de fichier dont on veux retirer les caractères spéciaux :
$nom_fichier = preg_replace('#[^a-zA-Z0-9\-\._]#', '_', $nom_fichier);
Et de quoi faire fonctionner des expressions régulières avec de l'UTF-8 :
$texte=utf8_decode($texte);
$mot=utf8_decode($mot);
$texte=preg_replace('#(?!<.*?)('.preg_quote($mot).')(?![^<>]*?>)#i','<span class="found">\1</span>',$texte);
$texte=utf8_encode($texte);
N'hésitez pas à en parler dans les commentaires si vous avez aussi des astuces pour gerer l'UTF-8
Commentaires
Astuce #1 : utiliser Python
Astuce #2 : utiliser iconv à la place de utf8_(en|de)code, http://fr.php.net/iconv
Exemple : echo iconv('utf-8', 'ascii//TRANSLIT', 'Est-ce que les éléphants mangent des œufs à la coque ?');
Pour info, le charset "par défaut" dans la plupart des applications est l'ISO-8859-1, mais ce charset ne gère pas tous les caractères français. Pour le français on utilisait l'ISO-8858-15 en théorie. Sauf qu'en pratique, Microsoft s'est torché le cul avec les normes (comme d'hab) et nous a pondu le cp1252, qui est un ISO-8859-1 avec certains caractères non-imprimables remplacés par des caractères européens, dont les lettres françaises qui manquaient. Donc le cp1252 est de facto le charset "par défaut" sur tous les systèmes antiques et poussiéreux vendus en occident.
De nos jour l'UTF-8 est géré partout, sauf quelques langages boiteux et applications fossilisées, donc il n'y a aucune raison d'utiliser un autre charset. Comme par exemple, encoder toutes ses pages web en UTF-8. Et cela permet que les chaînes envoyées par le navigateur soient directement en UTF-8 d'ailleurs, donc pas besoin de conversion.
C'est tout pour aujourd'hui ~
Pour l'astuce 1, peu d'hébergeurs proposent du python dans leurs offre d'hébergement.
Pour l'astuce 2, il faut faire attention à iconv qui peut donner des résultats différents selon l'OS sur lequel on est.
Après, c'est sûr que UTF-8 est la solution à utiliser dès qu'on le peut histoire de se débarasser des problèmes d'encodage.
Oui bah python c'était du pur troll hein...
Quand à iconv() qui donne des résultats différents selon l'OS, t'es des exemples ? Par ce que bon, un caractère c'est un caractère... Ce sont des choses assez indépendante de l'OS en théorie :/
Au pire, les serveurs PHP sont toujours sous Linux :)
En fait, pour la différence d'OS pour iconv :
http://fr.php.net/manual/fr/functio...
On peut éviter le problème avec un setlocale