【bat】文字化けを直す方法|chcp 65001・UTF-8・Shift-JIS の使い分け

【bat】文字コードの違いで文字化けするときの対処法(Shift-JISとUTF-8) bat

バッチファイルで日本語を表示しようとしたら「縺ゅ>縺顔エ。縺励∪縺吶€」のような意味不明な文字列が表示された経験はありませんか。この問題の根本原因はバッチファイルの保存エンコーディング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 falsechcp 65001
Python set PYTHONUTF8=1 または set PYTHONIOENCODING=utf-8
Node.js set NODE_OPTIONS=--no-experimental-fetchchcp 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以降)。