在C++中将所有重音字母更改为普通字母

One*_*ore 14 c c++ string

这个问题

如何在C++(或C)中将所有重音字母更改为普通字母?

通过这个,我的意思是eéèêaàäâçc会成为一样eeeeaaaacc.

我已经尝试过的

我试过手动解析字符串并逐个替换它们中的每一个,但我认为必须有一个更好/更简单的方法,我不知道(这会保证我不会忘记任何重音字母) .

我想知道标准库中是否已有地图,或者是否所有重音字符都可以使用某些数学函数轻松映射到"普通"字母(例如floor(charCode-131/5) + 61)).

小智 8

char* removeAccented( char* str ) {
    char *p = str;
    while ( (*p)!=0 ) {
        const char*
        //   "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
        tr = "AAAAAAECEEEEIIIIDNOOOOOx0UUUUYPsaaaaaaeceeeeiiiiOnooooo/0uuuuypy";
        unsigned char ch = (*p);
        if ( ch >=192 ) {
            (*p) = tr[ ch-192 ];
        }
        ++p; // http://stackoverflow.com/questions/14094621/
    }
    return str;
}
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于`ISO-Latin-1`编码** (5认同)

Jok*_*_vD 6

我只在理论上知道.基本上,您执行Unicode规范化,然后进行一些分解,清除所有变音符号,然后重新组合.


kri*_*iss 6

你应该首先用"重音字母"来定义你的意思,如果你所拥有的是一些扩展的8位ASCII,一个代码大于128的国家代码页,或者说一些utf8编码的字符串,那么必须做的事情大不相同.

但是你应该看一下libicu,它提供了基于良好unicode的重音字母操作所必需的功能.

但它不会为你解决所有问题.例如,如果你收到一些中文或俄文字母,你该怎么办?如果你得到土耳其大写字母,我该怎么办?删除这个"我"的点?这样做会改变文本的含义......等等.这种问题对于unicode来说是无穷无尽的.即使是传统的分拣顺序也取决于国家......