Comment supprimer les accents et tilde dans un c++ std:: string

j'ai un problème avec une chaîne en C++ qui a plusieurs mots en espagnol. Cela signifie que j'ai beaucoup de mots avec des accents et des tildes. Je veux les remplacer par leurs homologues non accentués. Exemple: je veux remplacer ce mot: "había" pour habia. J'ai essayé de le remplacer directement mais avec la méthode de remplacement de la classe string mais je n'ai pas pu obtenir que cela fonctionne.

j'utilise ce code:

for (it= dictionary.begin(); it != dictionary.end(); it++)
{
    strMine=(it->first);
    found=toReplace.find_first_of(strMine);
    while (found!=std::string::npos)
    {
        strAux=(it->second);
        toReplace.erase(found,strMine.length());
        toReplace.insert(found,strAux);
        found=toReplace.find_first_of(strMine,found+1);
    }
}

dictionary est une carte comme ceci (avec d'autres entrées):

dictionary.insert ( std::pair<std::string,std::string>("á","a") );
dictionary.insert ( std::pair<std::string,std::string>("é","e") );
dictionary.insert ( std::pair<std::string,std::string>("í","i") );
dictionary.insert ( std::pair<std::string,std::string>("ó","o") );
dictionary.insert ( std::pair<std::string,std::string>("ú","u") );
dictionary.insert ( std::pair<std::string,std::string>("ñ","n") );

et toReplace cordes est:

std::string toReplace="á-é-í-ó-ú-ñ-á-é-í-ó-ú-ñ";

je dois rater quelque chose. Je ne peux pas le comprendre. Est-il une bibliothèque que je peux utiliser?.

Merci,

13
demandé sur chema989 0000-00-00 00:00:00

2 réponses

tout d'abord, c'est une très mauvaise idée: vous altérez la langue de quelqu'un en enlevant des lettres. Bien que les points supplémentaires dans des mots comme "naïve" semblent superflus pour les gens qui ne parlent que l'anglais, il y a littéralement des milliers de systèmes d'écriture dans le monde dans lesquels de telles distinctions sont très importantes. Écrire un logiciel pour mutiler le discours de quelqu'un vous met carrément du mauvais côté de la tension entre l'utilisation des ordinateurs comme moyen d'élargir le domaine de l'expression humaine contre les outils de oppression.

Quelle est la raison pour laquelle vous essayez de faire cela? Est-ce que quelque chose s'étouffe sur les accents? Beaucoup de gens aimeraient t'aider à résoudre ça.

cela dit, libicu peut faire cela pour vous. Ouvrez la transform demo ; copiez et collez votre texte espagnol dans la case "entrée"; entrez

NFD; [:M:] remove; NFC

comme "composé 1" et cliquez transformer.

(avec l'aide de la diapositive 9 de Unicode se transforme en ICU . Les diapositives 29-30 montrent comment utiliser L'API.)

17
répondu andrewdotn 2008-09-28 00:02:25

Je ne suis pas d'accord avec la réponse actuellement" approuvée". La question est parfaitement logique lorsque vous indexez du texte. Comme la recherche non sensible à la casse, la recherche non sensible à l'accent est une bonne idée. "naïve" correspond à " Naïve "correspond à" naïve "correspond à" naïve "(vous do savez-vous que je suis en turc? C'est pourquoi vous ignorez les accents)

maintenant, le meilleur algorithme est suggéré à la réponse approuvée: utiliser NKD (décomposition) pour décomposer les lettres accentuées dans la lettre de base et un accent séparé, puis supprimer

23
répondu