2017-11-14 4 views
0

ICUのStringCharacterIteratorを使用して、送信元文字列から送信先文字列に文字をコピー(および場合によっては変更)しようとしています。しかし、私は予期しない結果を抱えており、理由は不明です。(ICU4C)Unicode文字列を文字単位で別のUnicode文字列にコピーする方法は?

私はこのプログラムの出力の最後の行が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のテーブル

111を取得します - ラテン小文字o

103 - ラテン小さな文字g

答えて

0

次の2つの問題を抱えて:イテレータは文字列の最後を超えている場合にのみ、偽

  1. StringCharacterIterator::hasNext戻ります。
  2. StringCharacterIterator::next32は、イテレータの現在位置を進め、新しいコードポイントを返します。生ポインタまたは標準ライブラリスタイルイテレータの場合は、*(++it)に似ています。

これをまとめると、文字列の最初の文字をスキップし、末尾の余分な文字を読み取っていることを意味します。

あなたは生のポインタまたは標準ライブラリのイテレータのため*(it++)ように振る舞うnext32PostInc、代わりのnext32使用することができます。

while(chars.hasNext()) 
    copy.append(chars.next32PostInc()); 
関連する問題