これは合理的な方法ですか?
はい、それは現代(1997年のように)のiostreamで期待される方法ではありません。
basic_streambuf<>
を通して出力する動作は、overflow(int_type c)
仮想関数によって定義されます。だから、適切なcodecvt<charT,char,typename traits::state_type>
コンバータとimbue
locale
することが期待される
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
ではありません。
免責事項:私は実際にこのようなことをしたことはないので、実際に実行可能かどうかはわかりません。
この男はcodecvtを使用することに同意しない:http://stackoverflow.com/a/8682250/99089 - だから誰が正しいの? –