Supprimer les accents d’une chaîne avec PHP

Si vous lisez ceci, vous ne voulez probablement pas supprimer que les accents, mais également les diacritiques d’une chaîne. (Par exemple la cédille de « ç » est un diacritique.)

Dans ce cas, vous êtes au bon endroit :

echo
    \Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC')
    ->transliterate('Héhé, ça marche !')
;
// Hehe, ca marche !

Comment ça marche ?

Le code ci-dessus utilise la classe Transliterator de l’extension intl, interface entre ICU et PHP.

Contrairement à ce que son nom indique, cette classe ne se limite pas à la translittération : elle est capable d’appliquer une série de transformations à du texte. NFD, [:Nonspacing Mark:] Remove et NFC sont les identifiants de trois transformations, combinés en un identifiant composé.

NFD

Cette transformation va normaliser le texte sous sa forme « D » (NFD est l’acronyme de Normalization Form D) en effectuant une décomposition canonique. Pour comprendre ce concept il faut savoir qu’Unicode offre la possibilité d’encoder certains caractères de manières différentes. Par exemple « ç » peut s’écrire comme un caractère, ou comme la combinaison d’un « c » et d’une cédille combinante. Cette dernière est la forme décomposée du caractère, c’est donc celle qui sera produite par la NFD.

[:Nonspacing Mark:] Remove

Ici la transformation « Remove » ne s’appliquera qu’aux caractères faisant partie de la catégorie Unicode « Nonspacing Mark ». Hors, tous les caractères combinants en font partie : puisqu’ils se lient au caractère qui les précède, ils n’occupent pas leur propre espace !

La transformation précédente servait à séparer les caractères de leurs diacritiques, et celle-ci va les supprimer. On se retrouve avec notre texte sans diacritique.

NFC

NFD a précédemment décomposé tous nos caractères ; il peut être pertinent de recomposer ceux qui restent (le sujet est débattable mais NFC semble privilégié). Par exemple les syllabes de l’alphabet hangeul ont leur propre caractère mais peuvent également être encodées par une combinaison de jamos. NFC réduirait une telle combinaison au caractère de la syllabe correspondante.

Pour finir

Si vous voulez approfondir les aspects d’Unicode abordés ici, je vous conseille évidemment leur documentation :

Le sujet est vaste ; bon courage !