Как скопировать строку (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

0

Решение

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

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

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]