Я пытаюсь использовать отделения интенсивной терапии 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
У вас есть две проблемы:
StringCharacterIterator::hasNext
возвращает false только тогда, когда итератор находится за концом строки.StringCharacterIterator::next32
продвигает текущую позицию итератора и возвращает новую кодовую точку. Это аналог *(++it)
для необработанного указателя или стандартного итератора стиля библиотеки.В совокупности это означает, что вы пропускаете первый символ вашей строки и читаете дополнительный символ за его концом.
Ты можешь использовать next32PostInc
, который ведет себя как *(it++)
для необработанного указателя или стандартного библиотечного итератора, вместо next32
:
while(chars.hasNext())
copy.append(chars.next32PostInc());
Других решений пока нет …