我正在尝试将包含重音的字符串转换为C ++中的纯ASCII字符串(用于索引)。我知道这个问题已被无数次询问,但与其他人不同,我没有选择包括任何第三方库,如ICU,甚至使用boost。
到目前为止,我已经尝试创建一个重音符号的地图(unsigned char到unsigned char),如下所示
map<unsigned char, unsigned char> myMap;
myMap['ì'] = 'i'; //few more like this
然后这个功能
string result;
for(size_t i = 0; i < inputString.size(); i++) {
if(myMap.count(inputString[i]) > 0) {
result += myMap[inputString[i]];
} else {
result += inputString[i];
}
}
但是当我尝试使用像“Forlì”这样的字符串时,它会返回Forl<C3>i
。为什么会这样?如何删除此额外<C3>
?
请注意,这将是生产级别的代码,因此我将避免包含重度类以进行这种微小的更改(只需用unsigned char表示的重音字符大小写)。
答案 0 :(得分:0)
也许您应该使用unsigned short
作为地图的第一种类型。同时将源文件保存为UTF16。
啊..使用basic_string&lt; char&gt;,我认为这段代码无论如何都不行。
原始文本必须使用UTF8或UTF16进行编码。读取它作为ASCII将介绍C / C ++标准库字符集转换。我怀疑在这一步中发生了C3。这种编码处理可能会使情况恶化。
实际上,Unicode只有65535个16位值。如果我们只针对像字符这样的字母,那么正确的代码转换是非常可行的,恕我直言。但是如果我们将它加载为ASCII,我们必须知道C / C ++ IO如何处理代码转换。
兼容性,可移植性......非常复杂。这是许多人使用类似ICU的ICU的原因之一。