2007-07-26

localeの謎

 もう何度目か分からないが、今分かっていることを書いてみる。  C++のロケール設定だが、まあ、次のような感じだ
// 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.