めもなので、ざっくりと。内容の一部に実験結果を含みます。
検証環境:Windows7(日本語版), Visual Studio 2015
※ソースコードのエンコードは、Shift-JIS (CR+LF)。
※コンソールウィンドウのコードページは、「932 (ANSI/OEM 日本語 Shift-JIS)」
(コンソールを「437 OEM - 米国」 などに設定すると、どのパターンでも文字化けします。)
#wcoutで日本語を出力したい場合
wcout.imbue(std::locale(""));
// システムのデフォルトが日本語の場合
wcout.imbue(std::locale("Japanese"));
などを使う。
※間違えてwcout.imbue(std::locale());
(localeに渡す引数が空)とすると、失敗する。
=> locale().c_str();
の戻り値は、C。
setlocale(LC_ALL, "");
などの影響は受けない。
例えば、
setlocale(LC_ALL, "C");
としても、wcout.imbue()で正しいロケールを設定してあれば、wcoutでは日本語の文字も出力される。
wcout.imbue()で正しいロケールを設定する前に、wcoutに日本語の文字を渡した場合は、
wcout.clear()
などでエラーをクリアするまで、(英語も含め)文字が出力されなくなります。
実験する時は、要注意。(気が付かないと、はまります。)
##coutでも日本語は出力できる。
puts("日本語");
などと同様で、ロケールがCになっていても、cout << "日本語";
は日本語の文字が出力される。
#setlocaleの影響を受ける関数
ヘルプ> 「ロケール」
https://msdn.microsoft.com/JA-JP/library/wyzd2bce(v=VS.140,d=hv.2).aspx
(coutなどは、このページに無いかと思います。<stdio.h>
と<iostream>
のどちらが必要かで考えると良いかも?)
#めも:ロケールで指定する値
見つけにくいですが…
ヘルプ> 「ロケール名、言語、および国/地域識別文字列」(setlocaleのページから飛べます)
ロケール名の一覧については、「Culture Name各国語サポートの (NLS) の API リファレンス」の の列を参照してください。
リンク先:
[MS-LCID]: Windows Language Code Identifier (LCID) Reference>
5 Appendix A: Product Behavior
https://msdn.microsoft.com/en-us/library/cc233982.aspx
※日本語は、ヘルプの「言語識別文字列」、「国/地域識別文字列」に入っていないので、
リンク先にあるリストから探しましょう。
Language | Location (or type) | Language tag | Supported version
Japanese | Japan | ja-JP | Release A
Japanese | Japan | ja | Release 7
std::locale()に渡すのは、Languageなど。
setlocale()に渡すのは、Language tagなど。
(詳細は、ヘルプ> 「ロケール名、言語、および国/地域識別文字列」を参照。)