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

How to copy a (ICU4C) Unicode string to another Unicode string character by character?

我正在尝试使用 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 table

111 - 拉丁文小写字母 o

103 - 拉丁文小写字母 g

你有两个问题:

  1. StringCharacterIterator::hasNext returns 仅当迭代器超出字符串末尾时才为 false。
  2. StringCharacterIterator::next32 前进迭代器的当前位置,returns 前进新代码点。它类似于原始指针或标准库样式迭代器的 *(++it)

总而言之,这意味着您将跳过字符串的第一个字符并读取末尾以外的额外字符。

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

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