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

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

本文关键字:字符串 Unicode 字符 复制 另一个 ICU4C      更新时间:2023-10-16

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

统一码表

111 - 拉丁小写字母 O

103 - 拉丁小写字母 G

您有两个问题:

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

综上所述,这意味着您将跳过字符串的第一个字符,并在末尾之后读取一个额外的字符。

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

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