LoginSignup
4

More than 5 years have passed since last update.

[めも]コンソールに日本語を出力したい場合(wcoutで日本語出力する場合など)

Last updated at Posted at 2017-02-12

めもなので、ざっくりと。内容の一部に実験結果を含みます。
検証環境: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など。
(詳細は、ヘルプ> 「ロケール名、言語、および国/地域識別文字列」を参照。)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4