Visual Studio 2019で「Visual Studio デバッグコンソール」への出力の文字化けを直す
コードページ変更方法
注
この記事は Visual Studio 2019 について書いています。
概要
Visual Studio 2019の「ローカルwindowsデバッガー」ターミナルのコードページの変更の仕方についてです。
私の場合デフォルトでは932(=Shift-JIS)になっていました。 これを65001(=utf8)に変えたいです。
- 「ローカルWindowsデバッガー」について
実行時に「Visual Studio デバッグコンソール」という名前のウィンドウで出てくるターミナルです。
Visual Studio 2019で新しいプロジェクトを作成するときにテンプレートで「コンソールアプリ」(C++)を選択すると、 デフォルトで出力ターミナルが「ローカルwindowsデバッガー」になると思います。
解決
先にどう解決したか書きます。
まず「ローカルwindowsデバッガー」のコードページをutf8に変えるには
- ソースコードに
windows.h
をインクルード - main関数内に
SetConsoleOutputCP(65001);
を記述
もちろんソースファイル側の文字エンコード方式(符号化方式)もutf8に合わせます。それは
これだけでは、コンパイラが文字列リテラルを扱う際の内部表現に用いられる文字コードがutf8に一致しない可能性があるため、それも明示します。それは
- 「プロジェクト」->「プロパティ」を選択
- 「C/C++」->「コマンドライン」を選択
- 「追加のオプション」欄に「
/source-charset:utf-8 /execution-charset:utf-8
」を入力
/execution-charset:utf-8
だけでも問題ないことを確認しましたが、後々面倒なことになるのは嫌なので2つとも書いてます。
また、SetConsoleOutputCP
関数の呼び出しはmain関数冒頭でなくてもよさそうですが、std::cout
などで出力が行われる行よりも前には呼び出されていないといけないようです。
これで文字化けは起きないと思われます。
参考ページ
- Microsoft Docs - SetConsoleOutputCP 関数
- Microsoft Docs - /source-charset (ソース文字セットの設定)
- stackoverflow - C++ Visual Studio character encoding issues
- stackoverflow - Visual Studio 2019でデバッグコンソールが文字化けする
経緯ほか
VSの「コンソールアプリ」テンプレートで\U
プレフィックスを使ったUnicode文字指定を使ってみたところ文字化けし、
しかもそれが中々直る気配がなかったので苦戦しました。
int main(){ std::cout << "ハロー\U00002580世界" << '\n'; return 0 }
これを出力すると
ハロー?世界
となりました。
例によって文字化けしています。
まあ「ローカルwindowsデバッガー」というターミナルにあえて固執する必要はありませんが、 コードページぐらいは変更できてもいいかなと思ったので色々調べるに至りました。
Visual Studioは難しい
ネット上で見かける記事も基本的に古いものが多く、公式日本語ドキュメントも読解が難しいので悪戦苦闘してます。 今回の件は結構文献が多いほうだったのでまだよかったです。
ただ結果的にターミナルのコードページ1つを変えるためだけにwindows.h
をインクルードして関数呼び出しにまで至っています。
果たしてこれが正解なのかは怪しい...