【VSCode × MinGW】(C言語) 実行時にターミナルが文字化けするときの対処方法
更新履歴
2023/11/11 初回投稿
2023/11/15 一部追記
はじめに
C言語をコンパイルする際, MinGWを利用してVSCode上のターミナル(PowerShell)でコンパイルすると, 文字化けしてしまう事例がみられるという報告があります.
私の環境でも, 同様の事例が発生しました.
今回は, こういった事例が発生してしまった場合の対処方法を検証します.
MinGW, VSCodeの環境構築についてはこの記事では掲載しません.
まだ未導入の方は以下の記事をご覧ください.
目標
この記事の目標は, やはり文字化けの解消です.
環境
私の検証では, 以下の環境で行いました.
(バージョン等が異なっても特に影響はない)
- Windows11 Pro x64 22H2
- gcc.exe (MinGW.org GCC Build-2) 9.2.0
検証
はじめに, どういう問題なのかを明確にしてましょう.
とりあえず, 検証用に以下の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間での文字化けになります.
解決方法
以下のいずれかの方法を利用します.
- コマンドの追加 (+ CodeRunner) (推奨)
- エンコーダーの変更 (あまり推奨しない)
- システムロケールの変更 (非推奨)
※基本的には1をご利用ください.
1. コマンドの追加 (+ CodeRunner) (推奨)
1. コマンドの追加
まずはコンパイルコマンドを以下のように変更します.
gcc {ソースファイル名.c} -fexec-charset=CP932
このコマンドはコンパイルする際に, 予め文字コードを指定する方法です.
CP932とはShift-JISを指定する文字コードです.
(CodePage932)
※CP932についてのWikipediaを掲載しておきます.
つまり今回のファイル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
追加が完了したらアンインストールの右側の設定マークをクリックして,
次のふたつの設定を変更します.
- Setting.json
設定を少し下がりCode-runner: Executor Mapを探して, その直下のsetting.jsonをクリックして開きます.
7行目(私の環境)の""(ダブルコーテーション)で囲まれたコードの書き換えをします.
C:
から始まる"(内容)"の部分を
デフォルトでは
"cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
となっている部分を
"cd $dir && gcc -fexec-charset=CP932 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
と変更します.
この設定は, 先ほどコンパイルする際に追加した-fexec-charset=CP932
というコマンドを自動的に追加するための設定です.
※設定を戻す場合も考えて, 従来のコードをコメントアウトや, 別ファイルでjsonを丸ごとコピーしていくことを推奨します.
※ご覧の環境によってはコードに改行が入っている可能性がありますが, 変更前のコードに倣って, 改行をいれずに1行に収めてください.
書き換え後のsetting.json
書き換えが完了したら, Ctrl + S
などでファイルを上書き保存して, 閉じてください.
- 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マクロにて文字化けが確認されています.
おまけ
エンコーダーの変更について検証
現在修正中です
Discussion