Ale*_*ejo 15 c++ string text str-replace
我在C++中有一个字符串的问题,它有几个西班牙语单词.这意味着我有很多带有重音符号和波浪号的单词.我想替换他们没有重音的同行.示例:我想替换这个词:哈比亚的"había".我尝试直接替换它,但使用字符串类的替换方法,但我无法让它工作.
我正在使用此代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
dictionary这样的地图在哪里(有更多条目):
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") );
Run Code Online (Sandbox Code Playgroud)
和toReplace字符串是:
std::string toReplace="á-é-í-ó-ú-ñ-á-é-í-ó-ú-ñ";
Run Code Online (Sandbox Code Playgroud)
我显然必须遗漏一些东西.我无法弄清楚.有没有我可以使用的图书馆?
谢谢,
MSa*_*ers 24
我不同意目前"批准"的答案.在索引文本时,这个问题非常有意义.与不区分大小写的搜索一样,重音不敏感搜索是个好主意."天真的"匹配"天真"匹配"天真"匹配"天真"(你不知道,一个大写的我是我的土耳其?这就是为什么你忽略重音)
现在,最好的算法暗示了批准的答案:使用NKD(分解)将重音字母分解为基本字母和单独的重音,然后删除所有重音.
不过,之后的重组很少有意义.您删除了大多数会改变的序列,而其他序列无论如何都是相同的.什么是NKC和æ在NKD之间的区别?
and*_*otn 17
首先,这是一个非常糟糕的主意:你通过删除字母来破坏某人的语言.尽管像"天真"这样的单词中的额外点对于只说英语的人来说似乎是多余的,但世界上有数以千计的书写系统,其中这些区别非常重要.编写软件以破坏某人的言论,使你在使用计算机作为扩大人类表达领域与压迫工具的手段之间的紧张关系的错误方面.
你试图这样做的原因是什么?是什么东西在口音上窒息?很多人都愿意帮助你解决这个问题.
也就是说,libicu可以为你做到这一点.打开变换演示 ; 将西班牙文本复制并粘贴到"输入"框中; 输入
NFD; [:M:] remove; NFC
Run Code Online (Sandbox Code Playgroud)
作为"化合物1"并单击转换.
(在ICU的Unicode转换幻灯片9的帮助下.幻灯片29-30显示了如何使用API.)