nislandのブログ

いろんなジャンルについて書くつもりです

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に変えるには

  1. ソースコードwindows.hをインクルード
  2. main関数内にSetConsoleOutputCP(65001);を記述

もちろんソースファイル側の文字エンコード方式(符号化方式)もutf8に合わせます。それは

  1. 「ファイル」->「名前を付けてxxx.cppを保存」->「上書き保存」の横にある下三角形をクリック->「エンコード付きで保存」を選択
  2. エンコード方式でutf8を選択

これだけでは、コンパイラが文字列リテラルを扱う際の内部表現に用いられる文字コードがutf8に一致しない可能性があるため、それも明示します。それは

  1. 「プロジェクト」->「プロパティ」を選択
  2. C/C++」->「コマンドライン」を選択
  3. 「追加のオプション」欄に「/source-charset:utf-8 /execution-charset:utf-8」を入力

/execution-charset:utf-8だけでも問題ないことを確認しましたが、後々面倒なことになるのは嫌なので2つとも書いてます。

また、SetConsoleOutputCP関数の呼び出しはmain関数冒頭でなくてもよさそうですが、std::coutなどで出力が行われる行よりも前には呼び出されていないといけないようです。

これで文字化けは起きないと思われます。

参考ページ

経緯ほか

VSの「コンソールアプリ」テンプレートで\Uプレフィックスを使ったUnicode文字指定を使ってみたところ文字化けし、 しかもそれが中々直る気配がなかったので苦戦しました。

int main(){
    std::cout << "ハロー\U00002580世界" << '\n';

    return 0
}

これを出力すると

ハロー?世界

となりました。
例によって文字化けしています。

まあ「ローカルwindowsデバッガー」というターミナルにあえて固執する必要はありませんが、 コードページぐらいは変更できてもいいかなと思ったので色々調べるに至りました。

Visual Studioは難しい

ネット上で見かける記事も基本的に古いものが多く、公式日本語ドキュメントも読解が難しいので悪戦苦闘してます。 今回の件は結構文献が多いほうだったのでまだよかったです。

ただ結果的にターミナルのコードページ1つを変えるためだけにwindows.hをインクルードして関数呼び出しにまで至っています。
果たしてこれが正解なのかは怪しい...