codecvt
ICU を使用してファセットを実装し、(ICU がサポートする) 文字エンコーディングを内部的に UTF-8 に変換したいと考えています。が存在し、この例codecvt_byname
に示すように、必要なことの一部を実行するために使用できることを認識しています。その例の問題点は、(1) ワイド文字ストリームを使用する (「通常の」バイト指向ストリームを使用したい) ことと、(2) 変換を実行するために 2 つのストリームが必要なことです。代わりに、次のような単一のストリームが必要です。
locale loc( locale(), new icu_codecvt( "ISO-8859-1" ) );
ifstream ifs;
ifs.imbue( loc );
ifs.open( "/path/to/some/file.txt" );
// data read from ifs here will have been converted from ISO-8859-1 to UTF-8
したがって、このような実装を行いたいのですが、ではなく ICU を使用しiconv
ます。それを考えると、私の実装do_in()
は次のとおりです。
icu_codecvt::result icu_codecvt::do_in( state_type &state,
extern_type const *from, extern_type const *from_end,
extern_type const *&from_next, intern_type *to,
intern_type *to_end, intern_type *&to_next ) const {
from_next = from;
to_next = to;
if ( always_noconv_ )
return noconv;
our_state *const s = state_store_.get( state );
UErrorCode err = U_ZERO_ERROR;
ucnv_convertEx(
s->utf8_conv_, s->extern_conv_, &to_next, to_end, &from_next, from_end,
nullptr, nullptr, nullptr, nullptr, false, false, &err
);
if ( err == U_TRUNCATED_CHAR_FOUND )
return partial;
return U_SUCCESS( err ) ? ok : error;
}
our_state
オブジェクトは 2 つのポインタを保持しますUConverter*
。1 つは「外部」エンコーディング (この例では ISO-8859-1) 用で、もう 1 つは UTF-8 エンコーディング用です。
私の質問は次のとおりです。
nullptr
上記のように「ピボット」バッファを指定する必要がありますか、それとも独自のものを提供する必要がありますか?reset
引数 (現在はfalse
上記の最初のもの) を に設定する必要がある場合はいつになるかわかりませんtrue
。flush
引数 (現在はfalse
上の 2 番目) をに設定するタイミングをtrue
どのように知るか、つまり、入力の最後に到達したタイミングをどのように知るかは明確ではありません。
少しの援助?