PHP : enlever les accents d’une chaîne de caractères

C’est une question récurrente sur les forums. Comment enlever les accents et les remplacer par leurs équivalences ?
Beaucoup utilise des fonctions de remplacement comme strtr, str_replace, preg_replace, etc. Ces fonctions ont toutefois leur inconvénient :

  • strtr : est incompatible avec UTF-8.
  • preg_replace : nécessite l’utilisation des expressions régulières.
  • et les trois fonctions demandent de définir une liste de correspondance.

Une extension permet de palier à ces inconvénients : iconv.

La fonction de base de cette extension est de gérer la conversion de chaîne d’un jeu de caractères vers un autre. Ceci est rendu possible grâce à deux lignes de code :

setlocale(LC_CTYPE, 'fr_FR.UTF-8');
echo iconv('UTF-8', 'ISO-8859-15//TRANSLIT//IGNORE', 'Chaîne de caractères à convertir.');

La chaîne de caractères est convertie de l’UTF-8 vers l’ISO-8859-15.

Vous remarquerez deux paramètres intéressants :

  • //TRANSLIT : demande à ce que les caractères ne pouvant être convertis vers le jeu de caractères de sortie soient transformés dans un format compréhensible en utilisant les caractères disponibles.
  • //IGNORE : la chaîne de caractères sera tronquée si un caractère ne pouvant être représenté dans le jeu de caractères de sortie est rencontré.

C’est en utilisant ces deux paramètres qu’il nous sera possible de supprimer les accents avec iconv. Il faut donc chercher un jeu de caractères où ces derniers ne sont pas supportés.

Pour cela, nous allons utiliser l’ASCII. Effectivement, celui-ci ne gère que 128 caractères, ce qui correspond à notre recherche puisque les caractères accentués y sont absents.

Pour en finir avec cet article, voici donc le code à utiliser pour la conversion des caractères accentués :

setlocale(LC_CTYPE, 'fr_FR.UTF-8');
echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'Chaîne de caractères à convertir.');
// résultat : Chaine de caracteres a convertir.

Une petite mise en garde est nécessaire tout de même. Les caractères non supportés par l’ASCII seront convertis en une équivalence proche lorsque cela sera possible. Par exemple :

setlocale(LC_CTYPE, 'fr_FR.UTF-8');
echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', '© ® « »');
// résultat : (C) (R) << >>

Ce qui n’est ni un inconvénient ni un avantage puisque cela dépend principalement de vos besoins.

9 réflexions sur « PHP : enlever les accents d’une chaîne de caractères »

  1. Attention tout de même. Le comportement varie en fonction de l’implémentation d’iconv utilisée.

    Avec iconv de la glibc, é sera traduit en e, avec GNU libiconv, ce sera e’.

  2. Ouah, premier commentaire hors spam du site !! Merci shrom 😀

    Sinon, je vois effectivement dans le PHP Info de mon serveur que l’implémentation utilisée est glibc.
    Donc le « é » est bien traduit en « e ».

  3. Ping : Tweets that mention PHP : enlever les accents d’une chaîne de caractères | Programmation web -- Topsy.com

  4. N’ayant pas trouvé il y a quelques mois de moyen me satisfaisant pour transformer les caractères non-alphanumériques d’une chaîne de caractères en PHP, j’ai implémenté ma propre solution :
    alphanormalize
    http://www.opimedia.be/DS/webdev/index.htm#PHP_alphanormalize
    Les accents sont enlevés, les lettres grecques remplacés par une ou deux lettres, et les caractères non-alphanumériques par un caractère choisi (‘_’ par défaut). Le module fourni quelques tables associatives pouvant être utilisées pour des changements semblables…

    • Je n’ai pas regardé ton code, mais cela pourra être une alternative à « iconv » qui présente des contraintes.

      Sinon, j’aime bien ton afficheur LCD 😉
      Je me demande s’il ne serait pas possible d’en faire une version full CSS avec les animation de la version 3. Mais, je n’ai pas assez approfondie les nouvelles fonctionnalités pour savoir si c’est faisable.

      • Le code est très simple, un string est parcouru caractère par caractère (donc ce n’est probablement pas très performant sur de grands textes) et le remplacement est effectué par les deux tables associatives $ACCENTALPHA_TO_ALPHA[] ou $GREEK_TO_ALPHA[] :
        http://www.opimedia.be/DS/webdev/PHP/alphanormalize/alphanormalize_test.php

        Dans l’archive disponible il y a un script Python utilisé pour générer ces deux tables. J’ai rusé pour trouver les caractères accentués : l’idée c’est que les entities HTML représente par exemple un ‘é’ par ‘é’, donc à partir de la liste de ces entities j’obtiens la liste des caractères accentués dont je peux enlever les accents. J’ai utilisé Python car contrairement à PHP il fournit la liste complète des entities (et puis c’est nettement plus agréable). En passant j’ai ajouté des tables associatives PHP pour combler cette lacune.

        Ouais, je l’aime bien aussi mon afficheur LCD, merci. L’afficheur en tant que tel n’a pas besoin de JavaScript, il peut afficher n’importe quoi de statique. Je ne sais pas ce que permettent les animations CSS3 mais cela m’étonnerait que cela permette une mise à jour de l’heure sans exécution de code côté client, donc sans JavaScript. Si quelqu’un à une idée…

  5. Votre code
    echo iconv(‘UTF-8’, ‘ASCII//TRANSLIT//IGNORE’, ‘Chaîne’);
    m’aide mais la chaîne à enregistrer qui était « pièces » est devenue « pices ».
    C’est dire que iconv a supprimé la lettre accentuée et remplacé.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.