// C++のグローバルロケールの設定
std::locale::global( std::locale("") ) ;
// Cのロケールの設定
setlocale(LC_ALL, "") ;
// すでに作成されているオブジェクトのロケールを変更
std::cin.imbue ( std::locale("") ) ;
std::wcin.imbue( std::locale("") ) ;
std::cout.imbue( std::locale("") ) ;
std::wcout.imbue( std::locale("") ) ;
std::cerr.imbue( std::locale("") ) ;
std::wcerr.imbue( std::locale("") ) ;
// OEMコードページにはない文字の出力
std::wcout << L"ハローワールド" << std::endl ;
// OEMコードページにはない文字の入力
std::wstring buf ;
std::wcout << "ワイド文字を入力してください:" ;
std::wcin >> buf ;
std::wcout << buf << std::endl ;
これでいいはずなのだ。実際、VC7.1では、これはうまくいく。しかし、VC8では、なぜかグローバルのロケールがCロケールでないと、日本語版Windowsにおいて、OEMコードページ以外の文字の、コンソールの入出力がうまくいかない。ファイルの入出力はうまくいく。グローバルのロケール設定をせずにimbueだけ設定しておくと、問題なく出力できる。何故だ。また、VC7.1では、単にグローバルロケールを変えておくだけで、ワイド文字の入出力ができる。不思議だ。
また、Unicodeにしかない文字(たとえば❤など)を出力しようとしたが、コンソールでは表示されななかった。これはいいとして、ファイルにも出力されない。一体どうしたことか。wstringstreamでは、❤を出力することができた。というか、これは単にShift-jisに変換されているだけのようだ。ワイド文字のまま出力するにはどうすればいいのだろう。
P.J. Plauger様、ワイド文字は無視ですか?
No comments:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.