Avec des lettres de A à Z

Le truc que j’ai du faire avec quasi­ment tous les langages mais pour lequel j’ai rare­ment trouvé une solu­tion satis­fai­sante : trans­for­mer un texte en reti­rant tous les accents et conver­tis­sant les lettres pour ne garder que les a à z.

Tant que je me limite au français, italien et espa­gnol, j’ai une suite de recher­cher-rempla­cer 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’aven­ture hors du français, je risque d’en oublier.

Via Le Hollan­dais Volant, une solu­tion 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 conver­tir æ et œ, qui seront oubliés ici. Il faut donc ajou­ter ces deux cas et leur version en majus­cule. Du coup c’est mieux mais pas encore ça.

On peut se dire qu’en échange ça fonc­tionne pour toutes les langues, pas que le français, mais c’est passer à côté des spéci­fi­ci­tés locales. Si en français ö peut être dégradé en o, en alle­mand c’est l’équi­valent de oe.

Reti­rer les signes diacri­tiques ne suffit pas pour obte­nir une version accep­table. La conver­sion dépend de la langue. L’al­le­mand est loin d’être la seule langue avec ce type de spéci­fi­ci­tés. Il faudra aussi ajou­ter les lettres propres à chaque langues, comme ß qui donne­rait 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éfi­nir la bonne locale avant. Ce n’est pas un défaut, c’est une fonc­tion­na­lité : Le résul­tat sera diffé­rent pour diffé­rentes locales.


Publié

dans

,

par

Étiquettes :

Commentaires

Laisser un commentaire

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