Visual Studio 2005 の std::wout で正常に文字が出力されなくなる問題について。

……また VS2005 ぉー? もー… orz


UNICODE ビルドを行ってますので、cout は利用せずに wcout を利用する事になります。 で、日本語文字列が上手く出力されないという問題に遭遇してまして「あー、"japanese" に locale 設定せにゃあきませんか」と気づいた訳です。

今までのアプリは、ぶっちゃけ wcout なんて使う事無かったので^^; ::_tsetlocale(LC_ALL, _T("japanese")) == C言語の領域 で事足りてたのですが、今回は ストリームですので、C++の領域も設定してあげなくてはいけません。

というわけで、

// 全体へ設定を反映する
std::locale::global(std::locale("japanese"));

なんて打って、全体へ設定を反映させてみようと試みてみたのですが…何も表示されなくなってしまいました。 …はて? 何故かしら〜…?

グローバル変数として存在している wcout は main が始まる前に(コンストラクタで)初期化が完了している故に、後から設定した local の値とトラブル起こしてるのかしらー?

ということで

// ストリーム個別の設定を行う
std::wcout.imbue(std::locale("japanese"));

なんてしてみたのですが、やっぱり文字が表示されない… うーん、何故?



そもそも、locale なんて オブジェクトは使った事無いわ、iostream 系もよく知らない状態なので、ぶっちゃけ何が原因なのか特定できない状態だったりするのです。 個人的には、オブジェクトの使い方間違ってるんだろうなー……なんて思って、MSDNなりネットなりで調べていたのですがー……


http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7

Visual Studio 2005 Pro + windows XPの環境でざっくりコードを追ってみたのですが、ライブラリのバグっぽいですね・・・


 ぎ ゃ ふ ん !



結論としては、std::locale::global(std::locale("japanese")); を行っては いけないらしい です。

…って、そりゃーねーだろうよ、Microsoft さんよ……。 6時間ぐらいを返せ… =■●_




なんつーか、VS2005 は全体的におかしいよ…

追記

wofstream を利用した所、日本語出力の挙動がなんかおかしいです… orz
locale 設定してもしなくても結果が変わらないとかいう謎の状態に…

んもー…… orz

↑これは問題解消しました。いつのまにか。^^;
何が原因なのかイマイチわかりませんが、何かしら私の使い方が悪かったようです…