在没有ICU或boost的情况下,在C ++中规范化unicode字符?

时间:2015-03-03 05:51:17

标签: c++ unicode

我正在尝试将包含重音的字符串转换为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表示的重音字符大小写)。

1 个答案:

答案 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的原因之一。