none
wcoutのlocale

    質問

  • Visual Studio 2005のwcoutについて質問があります。

    日本語を出力する為に、wcout.imbue(locale("japanese")を指定したのですが、

    設定直後は問題ないのですが、

    locale::global(locale("japanese")

    を設定すると、wcoutに日本語が出力されなくなります。

    locale::global(locale("japanese")設定後は再びwcout.imbue(locale("japanese")を指定しても日本語が出力されません。

     

    使い方が間違っているでしょうか?

    2006年2月15日 7:08

すべての返信

  •  ゆきおさん は書きました:

    locale::global(locale("japanese")

    を設定すると、wcoutに日本語が出力されなくなります。

    私の環境でもそうなりました。(WinXp Pro SP2 , VS2005 Pro)

     

    VC6 と BCC では wcout.imbue~はしなくても、 locale::global~ を設定するだけで出来るんですけどね。

     

    locale::globalが効いていないわけではないようなんですけどね。

    (ostringstreamで試したけどちゃんと変わっていた)

     

    一応参考。ほとんど読んでいないけどw

    標準 C++ ライブラリの入出力とロケール

    2006年2月15日 13:51
  • 回答ありがとうございます。

    C++の規格では、locale::globalを行うと、以降に作成するオブジェクトについてlocaleが適用されるという事なので、locale::globalを行ってもwcoutのロケールが変わらないというのは、正しい動きになるようです。

     

    追加で、locale::globaelの代わりに、Cのsetlocale関数を呼んだ後も、同様にwcoutのimbueを呼んでもwcoutへ日本語が出力出来なくなります。

     

     

    2006年2月16日 7:02
  • Visual Studio 2005 Pro + windows XPの環境でざっくりコードを追ってみたのですが、ライブラリのバグっぽいですね・・・。

    fstreamの中で、ロケール変数を使って

    wchar_t から マルチバイト文字へ変換後、1charずつ、いろいろ経てwrite.cの_write_nolockに渡されるのですが、グローバルロケールが"C"の時は、そのまま1バイトずつ出力してくれますが、localeCでない場合、isleadbyteで1バイト目をチェックご、isleadbyteがtrueの場合は、2バイト以上渡されてないと、エラーが返されるようです。

     

    改行コードを気にしなければ、

     

    _setmode(_fileno(stdout), _O_BINARY);

     

    にしてしまえば、避けられるみたいですね。テキストモードの時以外は、上記の処理を行わないみたいなので。

     

     

    2006年2月17日 4:35
  • 追試しました。思いっきりバグのようです。

    Apache stdcxx では予想通りに振舞いました。

    #include <iostream>
    #include <locale>

    int main() {
      std::locale jp("japanese");
      std::wstring str = L"japan or 日本";
      std::wcout << str << std::endl; // ← バケた
      std::wcout.imbue(jp);
      std::wcout << str << std::endl; // ←ちゃんと書けた
    }

    2006年3月14日 10:08
  • ゆきおさん、ご投稿ありがとうございます。

    ご報告いただきました現象を確認いたしました。本現象は不具合によるものと思われます。次期バージョンでの修正を検討させていただきます。

    ありがとうございました。今後ともよろしくお願いいたします。

     

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

     

    2006年3月23日 11:13