batファイルで日本語が文字化けした原因と対処法|UTF-8とShift_JISの違いにハマった話

bat

仕事中に、ちょっとした作業用に 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)で作る。

これが、
仕事で使うバッチを安全に運用するための、
いちばん現実的な結論だと思っている。

コメント

タイトルとURLをコピーしました