1

私は ICU (IBM のユニコード ライブラリ) を初めて使用します。大きなファイルをチャンクで読み込んでおり、UTF-8 から UTF-16 に変換しようとしています。

ucnv_toUnicode を使用していますが、問題が発生しています。コンバーターによってターゲットに書き込まれたバイト数をどのように判断すればよいですか?

        ucnv_toUnicode(conv, &target, targetLimit, 
                   &source, sourceLimit, NULL,
                   feof(f)?TRUE:FALSE,         
                   &status);

target は 4096 バイトのバッファです。

API ドキュメントによると、ucnv_toUnicode によって移動され、最後の UChar がコピーされた後にポイントされます。これを決定するために、ターゲットと元の位置の間である種の算術演算を行うことができるように思われますが、私は C が初めてです。誰か手を貸してもらえますか?

ここで、ターゲットに入れられたものを fwrite() したいとします。ユニットのサイズと数について fwrite に何を渡しますか?

4

1 に答える 1

2

ドキュメントが言うように:

Target [...] は、出力バッファー内の最初に使用可能な UChar でポインターを開始し、最後に出力に書き込まれた UChar の後にポイントします。

だから、それは簡単です:

char input[SLEN];
UChar output[TLEN];

char const * source = input;
UChar * target = output;

ucnv_toUnicode(conv, &target, output + TLEN,
               &source, input + SLEN, NULL, feof(f), &status);

target - outputこれで、UChars が出力バッファーに書き込まれました。

同じことが入力にも当てはまります。source - input文字(=バイト)を消費します。

于 2012-09-19T22:12:55.900 に答える