Boost.Iostreams で遊んでみた結果,最終的に以下のようなコードに行き着く.
( cry::iostreams::newline_filter は boost::iostreams::newline_filter が Peekable を要求していてあんまり使い物にならないのを改良したもの. cry::iostreams::u_converter は ICU のコード変換系ライブラリを Boost.Iostreams のフレームワークに載るようにラップしたもの.そのうちヒマができたらコードさらします.)
namespace io = boost::iostreams; io::copy( cry::iostreams::make_u_converter( io::compose( cry::iostreams::newline_filter( "cry::iostreams::newline::posix" ) , io::file_source( "inputfile", std::ios_base::binary ) ) , "Shift_JIS" ) , io::tee( cry::iostreams::make_u_converter( io::back_inserter( u ), "UTF-8" ) , cry::iostreams::make_u_converter( io::compose( cry::iostreams::newline_filter( "cry::iostreams::newline::dos" ) , io::file_sink( "outputfile", std::ios_base::binary ) ) , "EUC-JP" ) ) );
ちなみに上記の読み方は
「"inputfile" というファイルから始まる UNIX 形式の改行コード (LF) 変換 + Shift_JIS -> UTF-16 のコード変換をかました入力ストリームを, UTF-16 -> UTF-8 のコード変換をかました出力ストリームとして u へ push_back しつつ,同時に UTF-16 -> EUC-JP のコード変換 + DOS 形式の改行コード (CRLF) 変換をかました出力ストリームとして "outputfile" というファイルへ吐き出す.」です.もちろん全行程ストリーム扱い.
どう見ても変態です.
本当にありがとうございました.