Le truc que j’ai du faire avec quasiment tous les langages mais pour lequel j’ai rarement trouvé une solution satisfaisante : transformer un texte en retirant tous les accents et convertissant les lettres pour ne garder que les a à z.
Tant que je me limite au français, italien et espagnol, j’ai une suite de rechercher-remplacer qui me suffit :
const ascii_replacements = [
['áàâä', 'a'],
['éèêë', 'e'],
['íìîï', 'i'],
['óòôö', 'o'],
['úùûü', 'u'],
['ñ', 'n'],
['æ', 'ae'],
['œ', 'oe'],
].map(([search, replace]) => [
[new RegExp(search, 'gu'), replace],
[new RegExp(search.toUpperCase(), 'gu'), replace.toUpperCase()],
]).flat()
function ascii(text) {
return ascii_replacements.reduce(
(text, [search, replace]) => text.replace(search, replace),
text
)
}
Le gros problème c’est qu’il faut tout lister et que dès que je m’aventure hors du français, je risque d’en oublier.
Via Le Hollandais Volant, une solution qui utilise normalize
:
text.normalize("NFD").replace(/\p{Diacritic}/gu, "");
C’est plus court, presque magique, mais en général j’ai aussi besoin de convertir æ et œ, qui seront oubliés ici. Il faut donc ajouter ces deux cas et leur version en majuscule. Du coup c’est mieux mais pas encore ça.
On peut se dire qu’en échange ça fonctionne pour toutes les langues, pas que le français, mais c’est passer à côté des spécificités locales. Si en français ö peut être dégradé en o, en allemand c’est l’équivalent de oe.
Retirer les signes diacritiques ne suffit pas pour obtenir une version acceptable. La conversion dépend de la langue. L’allemand est loin d’être la seule langue avec ce type de spécificités. Il faudra aussi ajouter les lettres propres à chaque langues, comme ß qui donnerait ss.
Par le passé j’ai utilisé iconv
en PHP. Je me souviens que ce n’était pas parfait mais ça faisait ce type de job.
iconv('UTF-8', 'ASCII//TRANSLIT', $text)
Il faut juste penser à bien définir la bonne locale avant. Ce n’est pas un défaut, c’est une fonctionnalité : Le résultat sera différent pour différentes locales.
Laisser un commentaire