gpt4 book ai didi

c++ - ICU 迭代代码点

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:59 25 4
gpt4 key购买 nike

我的目标是逐个字符地迭代 Unicode 文本字符串,但下面的代码迭代的是代码单元而不是代码点,即使我使用的是 next32PostInc () 应该迭代代码点:

void iterate_codepoints(UCharCharacterIterator &it, std::string &str) {
UChar32 c;
while (it.hasNext()) {
c = it.next32PostInc();
str += c;
}
}

void my_test() {
const char testChars[] = "\xE6\x96\xAF"; // Chinese character 斯 in UTF-8
UnicodeString testString(testChars, "");
const UChar *testText = testString.getTerminatedBuffer();

UCharCharacterIterator iter(testText, u_strlen(testText));

std::string str;
iterate_codepoints(iter, str);
std::cout << str; // outputs 斯 in UTF-8 format
}


int main() {
my_test();
return 0;
}

上面的代码产生了正确的输出,即汉字斯,但是这个单个字符发生了 3 次迭代,而不是仅仅 1 次。有人可以解释我做错了什么吗?

简而言之,我只想在循环中遍历字符,并且很乐意使用任何需要的 ICU 迭代类。

仍在努力解决这个问题......

我还观察到一些使用 UnicodeString 的不良行为,如下所示。我正在使用 VC++ 2013。

void test_02() {
// UnicodeString us = "abc 123 ñ"; // results in good UTF-8: 61 62 63 20 31 32 33 20 c3 b1
// UnicodeString us = "斯"; // results in bad UTF-8: 3f
// UnicodeString us = "abc 123 ñ 斯"; // results in bad UTF-8: 61 62 63 20 31 32 33 20 c3 b1 20 3f (only the last part '3f' is corrupt)
// UnicodeString us = "\xE6\x96\xAF"; // results in bad UTF-8: 00 55 24 04 c4 00 24
// UnicodeString us = "\x61"; // results in good UTF-8: 61
// UnicodeString us = "\x61\x62\x63"; // results in good UTF-8: 61 62 63
// UnicodeString us = "\xC3\xB1"; // results in bad UTF-8: c3 83 c2 b1
UnicodeString us = "ñ"; // results in good UTF-8: c3 b1
std::string cs;
us.toUTF8String(cs);
std::cout << cs; // output result to file, i.e.: main >output.txt

我使用的是 VC++ 2013。

最佳答案

由于您的源数据是 UTF-8,您需要将其告知 UnicodeString。它的构造函数有一个用于该目的的 codepage 参数,但您将其设置为空字符串:

UnicodeString testString(testChars, "");

这告诉 UnicodeString 执行不变 转换,这不是您想要的。您最终得到 3 个代码点 (U+00E6 U+0096 U+00AF) 而不是 1 个代码点 (U+65AF),这就是您的循环迭代三次的原因。

您需要更改您的构造函数调用,让 UnicodeString 知道数据是 UTF-8,例如:

UnicodeString testString(testChars, "utf-8");

关于c++ - ICU 迭代代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com