2011-12-10 14 views
0

オンザフライで文字エンコードをトランスコードしたいと思います。私は、例えば、入出力ストリームと私自身のトランスコーディングstreambufを使用したいと思います。:iostreamsとICUを使用してオンザフライで文字をトランスコードする

xcoder_streambuf xbuf("UTF-8", "ISO-8859-1", cout.rdbuf()); 
cout.rdbuf(&xbuf); 

char *utf8_s; // pointer to buffer containing UTF-8 encoded characters 
// ... 
cout << utf8_s; // characters are written in ISO-8859-1 

xcoder_streambufの実装はICUのコンバータのAPIを使用します。このデータは(この場合はutf8_sから)入ってきて、トランスコードして、iostreamのオリジナルのsteambufを使って書き出します。

これは合理的な方法ですか?そうでない場合、何が良いでしょうか?

答えて

0

これは合理的な方法ですか?

はい、それは現代(1997年のように)のiostreamで期待される方法ではありません。

basic_streambuf<>を通して出力する動作は、overflow(int_type c)仮想関数によって定義されます。だから、適切なcodecvt<charT,char,typename traits::state_type>コンバータとimbuelocaleすることが期待される

const codecvt<charT,char,typename traits::state_type>& a_codecvt 
    = use_facet<codecvt<charT,char,typename traits::state_type> >(getloc()); 

basic_filebuf<>::overflow(int_type c = traits::eof())の説明はa_codecvtは以下のように定義されるa_codecvt.out(state, b, p, end, xbuf, xbuf+XSIZE, xbuf_end);を含みます。このようなマルチバイト文字のワイド文字から、またはそのようなUnicodeとEUCなどのワイド文字エンコーディング間など、別の文字エンコーディングから変換するとき

クラスcodecvt<internT,externT,stateT>で使用するためのものです。

Unicodeの標準ライブラリのサポートは、1997年以来、いくつかの進歩を遂げて:

特化codecvtは、UTF-32とUTF-8符号化方式との間で変換します。

これはあなたが望むようです(ISO-8859-1コードはUSC-4コード= UTF-32です)。

もしそうでなければ、何が良いでしょうか?

 
struct utf8 { 
    unsigned char d; // d for data 
}; 

struct latin1 { 
    unsigned char c; // c for character 
}; 

誤っISO-8859- *が期待されているUTF8を渡すことはできません。この方法は:

私は次のように、UTF8に異なるタイプをご紹介します。しかし、インターフェースコードを書く必要があり、ストリームのタイプはistream/ostreamではありません。

免責事項:私は実際にこのようなことをしたことはないので、実際に実行可能かどうかはわかりません。

+0

この男はcodecvtを使用することに同意しない:http://stackoverflow.com/a/8682250/99089 - だから誰が正しいの? –