Как скопировать строку (ICU4C) Unicode в другую строку Unicode символ за символом?

Я пытаюсь использовать отделения интенсивной терапии 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 ответ

Решение

У вас есть две проблемы:

  1. StringCharacterIterator::hasNext возвращает false только тогда, когда итератор находится за концом строки.
  2. StringCharacterIterator::next32 продвигает текущую позицию итератора и возвращает новую кодовую точку. Это аналог *(++it) для необработанного указателя или стандартного итератора стиля библиотеки.

В совокупности это означает, что вы пропускаете первый символ вашей строки и читаете дополнительный символ за его концом.

Ты можешь использовать next32PostInc, который ведет себя как *(it++) для необработанного указателя или стандартного библиотечного итератора, вместо next32:

while(chars.hasNext())
    copy.append(chars.next32PostInc());
Другие вопросы по тегам