我正在开发一个小型C ++应用程序,它可以进行一些字符串处理。目前,我想在特定字符索引处提取字符串。我使用string的at()方法的天真解决方案工作正常,但它打破了非ascii字符串。例如:
string test = "ヘ(^_^ヘ)(ノ^_^)ノ"
cout << test.at(0) << endl;
在gcc 4.2下为我输出一个英镑符号。我认为这也不是我的终端的问题,因为我可以打印出整个字符串就好了。是否有图书馆或我可以用来获得预期效果的东西?
答案 0 :(得分:2)
string
使用仅{8}的char
s。如果要编码16位字符,则需要使用wstring。
答案 1 :(得分:1)
你的字符串可能是UTF-8,其中“characters”和“bytes”不是一回事。 std::string
类假定“字符”各为一个字节,因此结果错误。
您的选择是将字符串转换为UTF-16并改为使用wstring
,您可以(通常)假设字符都是两个字节(wchar_t
或short
)每个,或者您可以使用像ICU或UTF8-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++;
}