如何将(ICU4C)Unicode字符串逐字符复制到另一个Unicode字符串?

时间:2017-11-14 00:47:58

标签: c++ unicode icu icu4c

我正在尝试使用ICU的StringCharacterIterator将字符串中的字符复制(并可能更改)到目标字符串。但是,我有意想不到的结果,我不确定为什么。

我希望此计划的最后一行输出为dog,但我得og∩┐┐

#include <iostream>
#include <icu4c/unicode/schriter.h>

int main()
{
    UnicodeString dog = UnicodeString::fromUTF8("dog");
    StringCharacterIterator chars(dog);

    UnicodeString copy;
    while(chars.hasNext())
        copy.append(chars.next32());

    for(int i=0; i<copy.countChar32(); i++)
    {
        int32_t charNumber = copy.char32At(i);
        std::cout << charNumber << "\n";
    }

    std::string stdString;
    copy.toUTF8String(stdString);
    std::cout << stdString;
}

节目输出

111
103
65535
og￿

Unicode表格

111 - 拉丁文小写字母o

103 - 拉丁语小写字母g

1 个答案:

答案 0 :(得分:0)

你有两个问题:

  1. StringCharacterIterator::hasNext仅在迭代器超出字符串结尾时才返回false。
  2. StringCharacterIterator::next32提升迭代器的当前位置并返回新的代码点。对于原始指针或标准库样式迭代器,它类似于*(++it)
  3. 总而言之,这意味着你要跳过字符串的第一个字符,并在结尾处阅读额外的字符。

    对于原始指针或标准库迭代器,您可以使用next32PostInc,其行为类似于*(it++),而不是next32

    while(chars.hasNext())
        copy.append(chars.next32PostInc());