これ、標準で欲しいです。一応 utf8_codecvt_facet.hpp, utf8_codecvt_facet.cpp を作成して、使います。namespace boost::detail は、ちょっといただけないかもしれませんが、そこはご愛嬌。
// utf8_codecvt_facet.hpp #ifndef BOOST_DETAIL_UTF8_CODECVT_FACET_HPP #define BOOST_DETAIL_UTF8_CODECVT_FACET_HPP #define BOOST_UTF8_BEGIN_NAMESPACE \ namespace boost { namespace detail { #define BOOST_UTF8_DECL #define BOOST_UTF8_END_NAMESPACE }} #include <boost/detail/utf8_codecvt_facet.hpp> #undef BOOST_UTF8_END_NAMESPACE #undef BOOST_UTF8_DECL #undef BOOST_UTF8_BEGIN_NAMESPACE #endif // BOOST_DETAIL_UTF8_CODECVT_FACET_HPP
// utf8_codecvt_facet.cpp #include <boost/config.hpp> #ifdef BOOST_NO_STD_WSTREAMBUF #error "wide char i/o not supported on this platform" #else #define BOOST_UTF8_BEGIN_NAMESPACE \ namespace boost { namespace detail { #define BOOST_UTF8_DECL #define BOOST_UTF8_END_NAMESPACE }} #include <libs/detail/utf8_codecvt_facet.cpp> #undef BOOST_UTF8_END_NAMESPACE #undef BOOST_UTF8_DECL #undef BOOST_UTF8_BEGIN_NAMESPACE #endif // BOOST_NO_STD_WSTREAMBUF
#include <iostream> #include <fstream> #include <string> #include "utf8_codecvt_facet.hpp" int main() { std::locale::global( std::locale("") ); std::wifstream ifs( "x.txt" ); ifs.imbue( std::locale(ifs.getloc(), new boost::detail::utf8_codecvt_facet ) ); while( ifs.good() ) { std::wstring wstr; std::getline( ifs, wstr ); std::wcout << wstr << std::endl; } }
ほんとは、char型のバッファに読み込まれてしまった utf8のコードに対して変換をかけたいのだが、めんどくさそうだ。
標準機能として、トラックバック機能が無いのは超めんどくさい
2011/07/07 追記: error C2661: 'std::locale::facet::operator new' というエラーになるのは、MFC のデバッグバージョン用 new が原因である。正直、この DEBUG_NEW 鬱陶しい。
#ifdef _DEBUG #define new DEBUG_NEW #endif
0 件のコメント:
コメントを投稿