C ++中的非ASCII字符串字符索引

时间:2009-11-24 01:22:29

标签: c++

我正在开发一个小型C ++应用程序,它可以进行一些字符串处理。目前,我想在特定字符索引处提取字符串。我使用string的at()方法的天真解决方案工作正常,但它打破了非ascii字符串。例如:

string test = "ヘ(^_^ヘ)(ノ^_^)ノ"
cout << test.at(0) << endl;

在gcc 4.2下为我输出一个英镑符号。我认为这也不是我的终端的问题,因为我可以打印出整个字符串就好了。是否有图书馆或我可以用来获得预期效果的东西?

2 个答案:

答案 0 :(得分:2)

string使用仅{8}的char s。如果要编码16位字符,则需要使用wstring

答案 1 :(得分:1)

你的字符串可能是UTF-8,其中“characters”和“bytes”不是一回事。 std::string类假定“字符”各为一个字节,因此结果错误。

您的选择是将字符串转换为UTF-16并改为使用wstring,您可以(通常)假设字符都是两个字节(wchar_tshort )每个,或者您可以使用像ICUUTF8-CPP这样的库来直接操作UTF-8字符串,执行“获取第3个字符”而不是“获取第3个字符”。

或者,如果你想要极简主义,你可以编写一个(相对)简单的函数来通过重用UTF-8字符串长度函数之一的内部来获得特定字符的字节偏移量和长度。上面列出的一个库或来自谷歌。基本上你必须检查每个字符并向前跳1-3个字节,以便根据设置的位来到达下一个字符的开头。

这是一个可以从PHP轻松翻译的内容:

for($i = 0; $i < strlen($str); $i++) {
    $value = ord($str[$i]);
    if($value > 127) {
        if($value >= 192 && $value <= 223)
            $i++;
        elseif($value >= 224 && $value <= 239)
            $i = $i + 2;
        elseif($value >= 240 && $value <= 247)
            $i = $i + 3;
        else
            die('Not a UTF-8 compatible string');
        }
    $count++;
} 

http://www.php.net/manual/en/function.strlen.php#25715