👍

【VSCode × MinGW】(C言語) 実行時にターミナルが文字化けするときの対処方法

2023/11/11に公開
更新履歴

2023/11/11 初回投稿
2023/11/15 一部追記

はじめに

C言語をコンパイルする際, MinGWを利用してVSCode上のターミナル(PowerShell)でコンパイルすると, 文字化けしてしまう事例がみられるという報告があります.
私の環境でも, 同様の事例が発生しました.

今回は, こういった事例が発生してしまった場合の対処方法を検証します.

MinGW, VSCodeの環境構築についてはこの記事では掲載しません.
まだ未導入の方は以下の記事をご覧ください.
https://zenn.dev/12morosy/articles/2c4d608cd0a38a

目標

この記事の目標は, やはり文字化けの解消です.

環境

私の検証では, 以下の環境で行いました.
(バージョン等が異なっても特に影響はない)

  • Windows11 Pro x64 22H2
  • gcc.exe (MinGW.org GCC Build-2) 9.2.0

検証

はじめに, どういう問題なのかを明確にしてましょう.
とりあえず, 検証用に以下のCソースファイルを作成した.

test.c
#include <stdio.h>

int main(void)
{
    printf("English\n");
    printf("ひらがな\n");
    printf("カタカナ\n");
    printf("漢字\n");

    return 0;
} 

※添付画像を他記事[1]と共通化しているため, 画像内のソースコードが異なる場合があります.
このファイルをベースに検証を進めていきます.
まずは普通にコンパイル, 実行していきます.
※コンパイル, 実行コマンドについての詳しい説明は省略します.

gcc test.c -o test.exe

でコンパイルファイルを実行します.

./test.exe

で実行します.
すると, 以下のような実行結果が出ました.

はい, 無事に文字化けしていますね.
文字化け内容を確認すればどの文字コードで文字化けしているかわかります.
今回はShift-JIS と UTF-8間での文字化けになります.

解決方法

以下のいずれかの方法を利用します.

  1. コマンドの追加 (+ CodeRunner) (推奨)
  2. エンコーダーの変更 (あまり推奨しない)
  3. システムロケールの変更 (非推奨)

※基本的には1をご利用ください.

1. コマンドの追加 (+ CodeRunner) (推奨)

1. コマンドの追加

まずはコンパイルコマンドを以下のように変更します.

gcc {ソースファイル名.c} -fexec-charset=CP932

このコマンドはコンパイルする際に, 予め文字コードを指定する方法です.
CP932とはShift-JISを指定する文字コードです.
(CodePage932)
※CP932についてのWikipediaを掲載しておきます.
https://ja.wikipedia.org/wiki/Microsoftコードページ932

つまり今回のファイルtest.cでは

gcc test.c -fexec-charset=CP932

とコンパイルします.
このコマンドを実行すると, コンパイルされた後のファイル名はa.exeとなります
※a.exeは最新の実行ファイルが上書きされていきます.

ファイル名を指定したい場合は

gcc {元ファイル名.c} -o {実行ファイル名.exe} -fexec-charset=CP932

または

gcc -o {実行ファイル名.exe} {元ファイル名.c} -fexec-charset=CP932

というコマンドを指定します.
要約すると

gcc {ソースファイル名.c} -o {実行ファイル名.exe} {文字コード指定}

または

gcc -o {実行ファイル名.exe} {ソースファイル名.c} {文字コード指定}

今回の場合は

gcc test.c -o test.exe -fexec-charset=CP932

というコマンドになります.
-oの位置を変えることで直感的な順番にすることが可能です.
こちらほうが順番的に覚えやすい.

※追記

gcc -o test.exe test.c -fexec-charset=CP932

-oの直後が実行ファイル, と覚えればよい.

実行は変わらず

./{実行ファイル名.exe}

私の環境と原因が一致していれば正しい文字コードで実行されるはずです.
※例外が発生した場合はお知らせください

実行結果

無事正しく実行することができました.

しかし, ここで比較的多くの方は,
コマンドを覚えて一回一回入力するのはめんどくさい! と思うはず.
次の項目では, ボタンひとつで, ショートカットひとつで実行できるようにします.

2. CodeRunner

拡張機能「CodeRunner」を追加しましょう.

CodeRunner

追加が完了したらアンインストールの右側の設定マークをクリックして,
次のふたつの設定を変更します.

  1. Setting.json
    設定を少し下がりCode-runner: Executor Mapを探して, その直下のsetting.jsonをクリックして開きます.

    7行目(私の環境)の""(ダブルコーテーション)で囲まれたコードの書き換えをします.
    C:から始まる"(内容)"の部分を
    デフォルトでは
default
"cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"

となっている部分を

after
"cd $dir && gcc -fexec-charset=CP932 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"

と変更します.
この設定は, 先ほどコンパイルする際に追加した-fexec-charset=CP932というコマンドを自動的に追加するための設定です.

※設定を戻す場合も考えて, 従来のコードをコメントアウトや, 別ファイルでjsonを丸ごとコピーしていくことを推奨します.
※ご覧の環境によってはコードに改行が入っている可能性がありますが, 変更前のコードに倣って, 改行をいれずに1行に収めてください.

書き換え後のsetting.json

書き換えが完了したら, Ctrl + Sなどでファイルを上書き保存して, 閉じてください.

  1. Run in Terminal
    設定をさらに下がったところ, Code-runner: Run In Terminalにチェックマークを入れましょう.
    これは保存など押す必要はありません.

以上の工程が終了したら, 念のため, VSCodeを再起動して, 再度test.cを開いてみましょう.
ファイルがアクティブの状態で,

  • Ctrl + Alt + N
  • 右上の再生ボタンの右側プルダウンRun Code
    のいずれかで実行できるようになります.


Run Code

2. エンコーダーの変更(あまり推奨しない)

VSCode右下,デフォルトではUTF-8となっている部分をクリックして,エンコード付きで再度開くShift-JIS を選択します.
こうすることでエディタとターミナルがShift-JISに統一されるので, 文字コード通りに実行されます.
※Windowsのファイルは基本的にUTF-8なのでVScode以外で編集するとエディタ自体も文字化けする可能性が高い

3. システムロケールの変更

非推奨のため, 内容を省きます.

Windowsの設定で地域管理システムロケールの変更
から,
ベータ:ワールドワイド言語サポートでunicode UTF-8を使用(U)
にチェックマークを入れます. 再起動を求められるので再起動をかけると, 設定は完了になります.
Windows自体の設定を変更するため, Windowsの他環境に影響を与える可能性があります.

他環境への影響

Excelマクロにて文字化けが確認されています.

おまけ

エンコーダーの変更について検証

現在修正中です

脚注
  1. 記事
    https://zenn.dev/12morosy/articles/2c4d608cd0a38a ↩︎

Discussion