仕事中に、ちょっとした作業用に bat ファイルを作って実行したところ、
日本語のメッセージが盛大に文字化けする、という事象に遭遇した。
内容自体は単純なバッチで、
エラーも出ていないのに表示だけがおかしい。
調べてみると原因ははっきりしていて、
UTF-8で保存した .bat ファイルを、Shift_JIS(CP932)前提のコマンドプロンプトで実行していたことだった。
今回は、このときに整理した原因と対処法をまとめておく。
起きた事象
- bat ファイル内で
echoしている日本語が文字化けする - コマンド自体は正常に実行されている
- 英数字は問題なく表示される
一見すると「フォントの問題?」にも見えるが、
実際にはもっと単純な理由だった。
原因:文字コードの前提が合っていなかった
Windows のコマンドプロンプト(cmd.exe)は、
デフォルトでは Shift_JIS(CP932)を前提に動いている。
一方で、
- エディタ(VS Code など)
- 最近の環境
では、
UTF-8 でファイルを保存するのが当たり前になっている。
今回のケースでは、
- bat ファイル:UTF-8で保存
- 実行環境:Shift_JIS前提のcmd
という組み合わせになっており、
日本語だけが正しく解釈されず、文字化けが起きていた。
対処法① batファイルをShift_JIS(CP932)で保存する
いちばん確実で、事故が起きにくい方法。
実施内容
- bat ファイルを Shift_JIS(CP932) で保存し直す
- メモ帳:
- 「名前を付けて保存」
- 文字コードを ANSI に指定
- VS Code:
- 右下のエンコーディング表示をクリック
- Shift JIS を選択して保存
- メモ帳:
この方法のメリット
- 追加設定が不要
- どの Windows 環境でも挙動が安定
- echo、コメント、ログ出力が崩れにくい
業務用のbatでは、この方法が一番安全だと感じた。
対処法② UTF-8のまま使う場合は、コードページを変更する
どうしても UTF-8 で管理したい場合は、
bat の先頭でコードページを変更する方法もある。
@echo off
chcp 65001 >nul
これで、
cmd の表示側を UTF-8(65001)に切り替える。
ただしこの方法は、
- 実行環境やフォントによっては表示が不安定
- 一部コマンドの出力が崩れることがある
という点に注意が必要。
業務で使うなら、慎重に使うべき方法だと思っている。
ログ出力がある場合は特に注意
画面表示は直っても、
echo 日本語メッセージ > log.txt
のようにファイルへ出力すると、
ログ側だけ文字化けすることもある。
ログを読むツールが Shift_JIS 前提の場合、
UTF-8ログは問題を引き起こしやすい。
ログを扱う bat では、
- 最初から Shift_JIS で統一
- 読み手(人・ツール)を意識する
ことが大切だと改めて感じた。
まとめ:迷ったらShift_JISで作るのが無難
今回の件で改めて感じたのは、
- Windowsのcmdは今でもShift_JIS前提
- UTF-8は便利だが、batではハマりやすい
- 業務用batは「安定」が最優先
ということ。
迷ったら、batファイルはShift_JIS(CP932)で作る。
これが、
仕事で使うバッチを安全に運用するための、
いちばん現実的な結論だと思っている。


コメント