バッチファイルで日本語を表示しようとしたら「縺ゅ>縺顔エ。縺励∪縺吶€」のような意味不明な文字列が表示された経験はありませんか。この問題の根本原因はバッチファイルの保存エンコーディングとCMDのコードページのズレにあります。
この記事では、文字化けが起きる仕組みを理解したうえで、chcpコマンドによる解決方法・エディタ別の保存設定・よくある落とし穴・実務テンプレートまでを体系的に解説します。
この記事で学べること
- CMDの文字化けが起きる仕組み(コードページ・エンコーディングの関係)
chcpコマンドの使い方と主要コードページ番号
- よくある文字化けパターン別の具体的な解決方法(echo・ログ出力・他プログラム連携)
- VS Code・サクラエディタ・Notepad++ での正しい保存エンコーディング設定
- 文字化け対策済みの実務テンプレート
バッチファイルの文字化けが起きる仕組み
文字化けを根本から直すには、まずなぜ化けるのかを理解することが重要です。
CMDのデフォルトコードページはShift-JIS(CP932)
Windowsのコマンドプロンプト(CMD.EXE)は、日本語環境では起動時にコードページ 932(Shift-JIS/CP932)が設定されています。コードページとは「この番号の文字コードで文字を解釈・表示する」という設定です。
コマンドプロンプト
:: 現在のコードページを確認する
chcp
:: 出力例(日本語Windows の場合)
現在のコード ページ: 932
バッチファイル自体の保存エンコーディングとのズレが原因
文字化けは以下の2つの設定が一致していないときに発生します。
| 設定 |
概要 |
確認方法 |
| CMDのコードページ |
CMDが文字を解釈・表示するときの文字コード |
chcpコマンド |
| batファイルのエンコーディング |
batファイル自体がディスクに保存されている文字コード |
エディタで確認 |
| batファイルの保存 |
CMDのコードページ |
結果 |
| Shift-JIS(CP932) |
932(デフォルト) |
✅ 正常に表示 |
| UTF-8(BOM付き) |
65001 |
✅ 正常に表示 |
| UTF-8(BOM無し) |
65001 |
✅ 基本的に正常 |
| UTF-8 |
932(デフォルト) |
❌ 文字化け |
| Shift-JIS |
65001 |
❌ 文字化け |
ポイント:「バッチファイルの保存エンコーディング」と「CMDのコードページ」を常に一致させることが文字化け対策の基本です。
chcp コマンドの基本
chcp(Change Code Page)コマンドは、CMDのコードページを確認・変更するコマンドです。
現在のコードページを確認する
コマンドプロンプト
chcp
:: 出力例
現在のコード ページ: 932
コードページを変更する
コマンドプロンプト
:: UTF-8 に変更
chcp 65001
:: Shift-JIS(CP932)に戻す
chcp 932
主要コードページ一覧
| コードページ番号 |
エンコーディング |
用途・特徴 |
| 932 |
Shift-JIS(CP932) |
日本語Windows のデフォルト。従来のバッチファイルで最も安定 |
| 65001 |
UTF-8 |
Unicode対応。Git・Python等の出力と相性が良い。Windows 10 1903以降で安定 |
| 1200 |
UTF-16 LE |
CMDでは通常使用しない |
| 20932 |
EUC-JP |
Linuxからのファイルを扱う場合など |
注意:chcpの変更はそのCMDウィンドウのセッション中のみ有効です。バッチファイルの冒頭で毎回設定する必要があります。
文字化けパターン別の解決方法
パターン1:echo で日本語が化ける
最も頻繁に起きる文字化けです。echoで日本語を出力しようとすると文字化けする場合、batファイルの保存エンコーディングとコードページが一致していないことが原因です。
【解決策A】Shift-JIS保存 + chcp 932(推奨・安定)
hello.bat(Shift-JIS で保存)
@echo off
:: コードページを Shift-JIS に明示(デフォルトだが念のため)
chcp 932 >nul
echo こんにちは、バッチファイル!
pause
【解決策B】UTF-8 BOM付き保存 + chcp 65001
hello.bat(UTF-8 BOM付き で保存)
@echo off
:: UTF-8 モードに切り替え
chcp 65001 >nul
echo こんにちは、バッチファイル!
pause
ポイント:どちらの方法でも動きますが、チームや既存環境との互換性を考えるとShift-JIS保存がシンプルで確実です。Git管理や他ツールとの連携が多い場合はUTF-8を検討してください。
パターン2:ログファイルへのリダイレクトで文字化けする
> log.txtでログを書き出すと、ファイルを開いたときに文字化けする場合があります。CMDのコードページに合わせたエンコーディングで出力されるためです。
logging.bat
@echo off
chcp 65001 >nul
:: UTF-8 でログ出力(メモ帳・VS Code 等でそのまま開ける)
echo [開始] 処理を開始します > log.txt
echo [完了] 処理が完了しました >> log.txt
注意:ログファイルをExcel・旧バージョンのメモ帳で開く場合は、Shift-JIS(chcp 932)で出力したほうが文字化けしにくいケースがあります。ログを読む環境に合わせて選択してください。
パターン3:Gitやpythonなど他プログラムの出力が文字化けする
Git・Python・Node.js など外部プログラムの日本語出力がCMD上で文字化けする場合、各プログラム側のエンコーディング設定も変更する必要があります。
| プログラム |
文字化け対策 |
| Git |
git config --global core.quotepath false + chcp 65001 |
| Python |
set PYTHONUTF8=1 または set PYTHONIOENCODING=utf-8 |
| Node.js |
set NODE_OPTIONS=--no-experimental-fetch + chcp 65001 |
| Java |
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 |
| PowerShell |
[Console]::OutputEncoding = [Text.Encoding]::UTF8 |
git-log.bat(Gitログを日本語で正常取得する例)
@echo off
chcp 65001 >nul
set GIT_PAGER=cat
git log --oneline -10
pause
パターン4:type コマンドや findstr でテキストファイルを読むと化ける
typeコマンドでテキストファイルを読み込むとき、ファイルのエンコーディングとCMDのコードページが一致していないと文字化けします。
read-file.bat
@echo off
:: UTF-8 のテキストファイルを読む場合
chcp 65001 >nul
type utf8_file.txt
:: Shift-JIS のテキストファイルを読む場合
chcp 932 >nul
type sjis_file.txt
エディタ別:正しい保存エンコーディングの設定方法
batファイルを保存するときのエンコーディング設定は、使用するエディタによって異なります。
| エディタ |
Shift-JIS で保存する方法 |
UTF-8 で保存する方法 |
| メモ帳(Windows 11) |
「名前を付けて保存」→ エンコード:ANSI |
「名前を付けて保存」→ エンコード:UTF-8(BOM付き)or UTF-8 BOMなし |
| VS Code |
右下のエンコード表示をクリック →「エンコード付きで保存」→ Shift JIS |
右下のエンコード表示をクリック →「エンコード付きで保存」→ UTF-8 or UTF-8 with BOM |
| サクラエディタ |
「ファイル」→「名前を付けて保存」→ 文字コードセット:SJIS |
文字コードセット:UTF-8(BOM付き推奨) |
| Notepad++ |
「エンコード」メニュー →「ANSI に変換」 |
「エンコード」メニュー →「UTF-8 に変換」(BOMなし)or「UTF-8 BOM付きに変換」 |
注意:VS Code はデフォルトでUTF-8(BOM無し)でファイルを保存します。chcp 65001 を使えば動作しますが、古いWindowsや特定環境ではUTF-8 with BOMの方がより確実です。新規作成時は必ずエンコーディングを確認してください。
実務テンプレート:文字化け対策済みの標準構成
現場で使える文字化け対策済みのテンプレートを2パターン紹介します。
【テンプレートA】Shift-JIS 版(既存環境・安定重視)
template_sjis.bat(Shift-JIS で保存すること)
@echo off
chcp 932 >nul
setlocal EnableDelayedExpansion
:: ---- 設定 ----
set LOG_FILE=%~dp0log\%date:~0,4%%date:~5,2%%date:~8,2%.log
:: ---- 処理開始 ----
echo [%date% %time%] 処理を開始します > !LOG_FILE!
echo 処理中...
:: ---- メイン処理をここに記述 ----
echo [%date% %time%] 処理が完了しました >> !LOG_FILE!
echo 完了しました。
pause
【テンプレートB】UTF-8 版(Git管理・多言語対応・新規開発向け)
template_utf8.bat(UTF-8 BOM付き で保存すること)
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
:: Python 等の外部ツールも UTF-8 に統一
set PYTHONUTF8=1
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
:: ---- 設定 ----
set LOG_FILE=%~dp0log\%date:~0,4%%date:~5,2%%date:~8,2%.log
:: ---- 処理開始 ----
echo [%date% %time%] 処理を開始します > !LOG_FILE!
echo 処理中...
:: ---- メイン処理をここに記述 ----
echo [%date% %time%] 処理が完了しました >> !LOG_FILE!
echo 完了しました。
pause
よくある失敗例と対処法
| 症状 |
原因 |
対処法 |
chcp 65001にしても化ける |
batファイルがShift-JISで保存されている |
ファイルをUTF-8(BOM付き)で保存し直す |
| UTF-8で保存したのに化ける |
chcp 65001を追加し忘れている |
@echo offの直後にchcp 65001 >nulを追加 |
| ログファイルが文字化けして開けない |
ログとエディタのエンコードが不一致 |
batとログをchcp 65001に統一してVS Codeで開く |
| ダブルクリック実行は正常なのにタスクスケジューラで化ける |
タスクスケジューラのCMD環境がデフォルト設定 |
batの先頭にchcp 932 >nulを明示的に追加 |
echoは正常なのに外部コマンドだけ化ける |
外部プログラムのエンコード設定が未対応 |
各プログラムの環境変数設定を追加(前述のパターン3を参照) |
まとめ
バッチファイルの文字化けは、「batファイルの保存エンコーディング」と「CMDのコードページ」を一致させることで解決できます。
| 方針 |
batの保存 |
batの先頭に記述 |
向いている場面 |
| Shift-JIS 方式 |
Shift-JIS(ANSI) |
chcp 932 >nul |
既存環境・Excel・旧システム連携 |
| UTF-8 方式 |
UTF-8(BOM付き推奨) |
chcp 65001 >nul |
Git管理・Python/Java連携・新規開発 |
ポイント:迷ったらShift-JIS + chcp 932がシンプルで確実です。新規プロジェクトやGitと連携する場合はUTF-8 BOM付き + chcp 65001が現代的な選択です。
よくある質問
❓ UTF-8 BOMあり・なしの違いは何ですか? (クリックで開閉)
BOM(Byte Order Mark)はファイルの先頭に付く数バイトのマーカーで、「このファイルはUTF-8です」とエディタやシステムに伝える役割があります。
- BOM付き UTF-8:CMDやメモ帳などWindowsツールとの互換性が高い。batファイルにはBOM付きを推奨
- BOM無し UTF-8:Linux/Mac環境や多くのWebサービスはこちらが標準。
chcp 65001環境では動作するが、古いWindowsでは認識されない場合がある
❓ chcp 65001 にすると処理が遅くなると聞いたのですが本当ですか? (クリックで開閉)
Windows の古いバージョン(Windows 7時代)では chcp 65001 でのパフォーマンス問題が報告されていました。しかし Windows 10 バージョン 1903 以降ではほぼ解消されており、現在の環境では気にする必要はありません。大量のループ処理を行うバッチでも実用上の問題は出ないケースがほとんどです。
❓ chcp の設定をシステム全体のデフォルトにするにはどうすればいいですか? (クリックで開閉)
レジストリで変更できますが、システム全体への影響が大きく推奨しません。代わりに各バッチファイルの冒頭に chcp を明示的に記述するほうが、どの環境でも確実に動作します。どうしてもシステムデフォルトを変更したい場合は「Windows の地域と言語設定」→「ベータ:ワールドワイド言語サポートで Unicode UTF-8 を使用」で全体をUTF-8に変更できます(Windows 10 1903以降)。