Comment enlever les accents des caractères en C++

Souvent lorsqu’on manipule du texte, on cherche à retrouver la forme de base des caractères, c’est-à-dire sans les signes diacritiques. Ce peut être utile pour générer une liste en ordre alphabétique de mots par exemple (on notera que dans l’ordre lexicographique des dictionnaires français, le E, et le É ont la même valeur).

Cet exercice peut être assez complexe car fortement dépendant de l’encodage des caractères (UTF-8, ASCII étendu, etc.) et de la définition donnée à « forme de base« . En effet, d’une langue à l’autre, cette notion peut varier et les diacritiques dans certaines langues donne une lettre à part entière. Par exemple en espagnol, la lettre ñ est une lettre à part qui est classée après le n.

Le remplacement des accents dans une application multi-langues est une tâche complexe et pour se faire, le mieux est d’être aidé par des bibliothèques comme ICU.

En revanche, pour tous les cas relativement fréquents où les caractères sont simplement codés sur un octet en utilisant l’ASCII étendu avec l’encodage ISO-Latin-1, on pourrait utiliser le petit bout de code suivant (inspiré d’une réponse sur Stack Overflow).

char RemoveAccent(char ch)
{
static const std::map<char, char> tr =
{
{'À', 'A'},
{'Á', 'A'},
{'Â', 'A'},
{'Ã', 'A'},
{'Ä', 'A'},
{'Å', 'A'},

{'Æ', 'E'},

{'Ç', 'C'},

{'È', 'E'},
{'É', 'E'},
{'Ê', 'E'},
{'Ë', 'E'},

{'Ì', 'I'},
{'Í', 'I'},
{'Î', 'I'},
{'Ï', 'I'},

{'Ð', 'D'},

{'Ñ', 'N'},

{'Ò', 'O'},
{'Ó', 'O'},
{'Ô', 'O'},
{'Õ', 'O'},
{'Ö', 'O'},

{'×', 'x'},

{'Ø', '0'},

{'Ù', 'U'},
{'Ú', 'U'},
{'Û', 'U'},
{'Ü', 'U'},

{'Ý', 'Y'},
{'Þ', 'p'},
{'ß', 's'},

{'à', 'a'},
{'á', 'a'},
{'â', 'a'},
{'ã', 'a'},
{'ä', 'a'},
{'å', 'a'},

{'æ', 'e'},

{'ç', 'c'},

{'è', 'e'},
{'é', 'e'},
{'ê', 'e'},
{'ë', 'e'},

{'ì', 'i'},
{'í', 'i'},
{'î', 'i'},
{'ï', 'i'},

{'ð', 'd'},

{'ñ', 'n'},

{'ò', 'o'},
{'ó', 'o'},
{'ô', 'o'},
{'õ', 'o'},
{'ö', 'o'},

{'÷', '/'},

{'ø', 'o'},

{'ù', 'u'},
{'ú', 'u'},
{'û', 'u'},
{'ü', 'u'},

{'ý', 'y'},
{'þ', 'p'},
{'ÿ', 'y'}
};

auto it = tr.find(ch);
if (it != tr.end()) {
return it->second;
}
return ch;
}
Accent remover

Laisser un commentaire

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