この記事について

バッチファイルの日本語だけが文字化けする、UTF-8で保存したら動かなくなった、画面では読めるのにログを開くと文字化けする。このようなときは、BATの保存形式・実行時のコードページ・出力先を分けて確認します。

chcp 65001を追加するだけで、すべて直るわけではありません。この記事では、Windowsのコマンドプロンプト(cmd.exe)で使うBATを対象に、元のファイルを残しながら原因を絞る手順を紹介します。PowerShellのスクリプトや、アプリ独自のログ設定は別に確認してください。

掲載画像の環境はWindows 11 Home 25H2(OSビルド26200.9457)です。メモ帳11.2607.14.0でファイルを表示し、Windows Terminal上のcmd.exeで日本語表示とキー入力待ちを確認しています。Windows Terminalのバージョンは未確認です。画像はクリックすると元のサイズで確認できます。

この記事でわかること

  • 文字化けしている場所から、最初に調べる項目を選ぶ方法
  • UTF-8・Shift-JISと、chcp 65001・932の関係
  • エディターで「読み直す」と「変換して保存する」の違い
  • 画面だけ・ログだけ文字化けするときの確認点

まず、どこで文字化けしているか確認する

作業前にBATのコピーを作り、検証用として別名で保存してください。文字化けした状態をそのまま上書きすると、元の日本語を戻せなくなることがあります。コピー・移動・削除などを含む本番用BATは、原因がわからないまま繰り返し実行しないでください。

  • エディターで開いた時点で読めない:ファイルを開く文字コードを確認する
  • エディターでは読めるが、実行すると日本語が崩れる:BATの保存形式と、実行するコンソールのコードページを確認する
  • 日本語が四角い記号になる:文字コードに加えて、日本語を表示できるフォントか確認する
  • 画面は読めるが、保存したログだけ読めない:ログを出すコマンドの出力形式と、ログを開く側の文字コードを確認する
  • 日本語を含むファイル名が見つからない:文字コードだけでなく、引用符・実行場所・実際のパスも確認する

BATの基本を先に確認したい方は、バッチファイルとは?できることと注意点も参考にしてください。

BATの保存形式とコードページは別のもの

UTF-8・Shift-JISは、ファイルに文字を保存する形式

同じ「日本語」という文字でも、UTF-8とShift-JISではファイルに保存されるバイト列が異なります。保存したときと違う形式として読み取ると、意図しない文字として解釈されることがあります。

Microsoftの一覧では、日本語のコードページ932はShift-JISとして示されています。この記事ではWindowsのCP932を対象とし、「Shift-JIS系」と表記します。保存時に扱える文字は形式によって異なるため、変換時の警告にも注意してください。

chcpは、実行中のコンソールのコードページを扱う

引数を付けずにchcpを実行すると、現在のコードページ番号を確認できます。番号を指定すると、そのコンソールのコードページを切り替えます。BATやログのファイル内容を別の文字コードへ変換するコマンドではありません。

主に確認する番号は、932が日本語のShift-JIS系、65001がUTF-8です。仕様はMicrosoft Learnのchcpと、コードページ識別子一覧で確認できます。

1.BATを正しい文字コードで開き直す

エディター上ですでに日本語が崩れている場合は、保存形式を変更する前に、元の文字コードで読み直します。ここで「読めない文字のままUTF-8で保存する」と、崩れた文字が保存されてしまいます。

VS Codeを使っている場合は、画面右下の文字コード表示をクリックし、「エンコード付きで再度開く(Reopen with Encoding)」を選びます。作成元の情報に合わせてUTF-8またはShift JISなどを選び、日本語が戻るか確認してください。表示言語やバージョンによって項目名は異なります。

日本語を正しく読み取れた後、形式を変更したい場合だけ「エンコード付きで保存(Save with Encoding)」を使います。「開き直す」は読み取り方を変える操作、「保存する」はファイルのバイト列を書き直す操作です。VS Code公式の文字コード操作も参考になります。

メモ帳で「ANSI」を選ぶ場合は、そのPCの設定を確認してください。ANSIは、どのPCでもShift-JISを意味する名前ではありません。「Windows 11だから必ずANSI」「Windows 11なら必ずUTF-8」のように、OSの名前だけで決めないようにしましょう。

2.chcpで現在のコードページを確認する

新しくコマンドプロンプトを開き、次を入力します。Windows Terminalを使っている場合も、PowerShellではなく「コマンドプロンプト」のプロファイルで確認してください。

chcp

表示された番号を控えます。932なら日本語のShift-JIS系、65001ならUTF-8のコードページです。この番号だけでは、BATファイル自体が何の文字コードで保存されているかはわかりません。

調査中は、この専用ウィンドウだけで作業してください。chcpでの変更は同じコンソールを使う後続処理にも関係するため、他の作業を続ける前に、控えた元の番号へ戻すか、検証用ウィンドウを閉じます。setlocalを書くだけでコードページまで自動的に元へ戻るとは考えないでください。

3.保存形式に合わせた小さなBATで確認する

最初はファイル操作を含めず、日本語を表示するだけのBATで試します。以下の2つは、それぞれ指定した文字コードで保存する例です。拡張子だけを変更しても文字コードは変わりません。

UTF-8で保存する場合

次を検証用のutf8-check.batとして、UTF-8(BOMなし)で保存します。コードページを切り替える行までは半角英数字だけにして、日本語を使う処理より前に、独立した行でchcpを実行します。

@echo off
chcp 65001 >nul
if errorlevel 1 exit /b 1
echo 日本語の表示を確認します。
pause
メモ帳でUTF-8版BATの日本語本文とUTF-8・Windows CRLF表示を確認した画面
UTF-8版のBAT。日本語本文と、ステータスバーのWindows (CRLF)・UTF-8表示を確認できます。
コードページ65001でUTF-8版BATを実行し日本語とキー入力待ちを表示した画面
開始時のコードページが65001の状態でUTF-8版を実行。日本語が表示され、pauseでキー入力を待っています。

65001はUTF-8用のコードページです。ただし、BATから起動する外部プログラムまで、すべてUTF-8の入力・出力に対応するとは限りません。この短い例で読めることと、本番用BAT全体が正しく動くことは分けて確認してください。

Shift-JIS系で保存する場合

日本語環境の既存ツールに合わせる必要がある場合は、検証用のsjis-check.batをWindowsのShift-JIS系(CP932)に対応する形式で保存し、932で確認します。保存時に文字が失われる警告が出た場合は、そのまま上書きしないでください。

@echo off
chcp 932 >nul
if errorlevel 1 exit /b 1
echo 日本語の表示を確認します。
pause
CP932で生成したBATの本文とメモ帳のANSI表示
CP932で生成したBAT。メモ帳ではANSIと表示されています。今回は生成時の指定とバイト列・SHA-256も照合しています。
コードページ932でCP932版BATを実行し日本語とキー入力待ちを表示した画面
開始時のコードページが932の状態でCP932版を実行。日本語本文とキー入力待ちのメッセージを確認できます。

UTF-8で保存したファイルにchcp 932だけを書いたり、Shift-JIS系のファイルにchcp 65001だけを書いたりしても、ファイル自体の変換にはなりません。エディターでの保存形式とセットで確認します。

BOMと、先頭行のエラーも確認する

BOMは、テキストファイルの先頭に付く識別用のバイト列です。UTF-8にはBOMあり・なしの両方があります。UTF-8のBOMは必須ではないため、この記事の確認用BATではBOMなしに揃えます。

メモ帳の保存画面にあるUTF-8とUTF-8 BOM付きの文字コード選択肢
メモ帳ではUTF-8とUTF-8(BOM付き)を区別して選べます。この画面は保存メニューの表示例で、保存操作は実行していません。

この画像はメモ帳のエンコード選択メニューです。検証用ファイルはUTF-8(BOMなし)で生成し、バイト列とSHA-256で照合しました。画像の「テキスト ドキュメント(*.txt)」という表示は、.batとして保存できた証拠ではありません。自分で保存するときは、保存後の拡張子が.bat.txtになっていないかも確認してください。

先頭行だけがコマンドとして認識されない場合は、BOMの有無、貼り付け時に混ざった文字、全角の記号を確認してください。UTF-16のファイルも「Unicodeだから同じ」と考えず、元のファイルを残して保存形式を確かめます。BOMの仕様はこちらです。

4.画面だけ・ログだけ文字化けする場合

画面の表示とフォントを確認する

BATの保存形式とコードページが合っていても、使用しているフォントに文字がなければ正しく表示できません。従来のコマンドプロンプトでラスター形式のフォントを使っている場合も、表示できるコードページに制約があります。日本語を表示できるフォントで確認してください。

一方で、エディターへコピーしても文字が崩れたままなら、フォントだけの問題とは限りません。BATの読み取りと、外部プログラムが出している文字を順に調べます。コンソールの入出力については、Microsoftのコンソールコードページの説明も参考になります。

ログを出したコマンドと、ログを開く側を確認する

画面表示とログファイルは別に確認します。出力をファイルへ向ける「>」は、それだけで任意の文字コードへ変換する機能ではありません。ログの文字コードは、出力したコマンドやオプションにも左右されます。

  • どのコマンドがログを書いたかを確認する
  • そのコマンドに文字コードやUnicode出力のオプションがあるか確認する
  • ログをエディターで開き直し、出力形式と読み取り形式を合わせる
  • 追記している場合は、途中から別の文字コードが混ざっていないか確認する

例えばrobocopyには、通常のログ指定のほかにUnicodeテキストで出す /UNILOG があります。/UNILOGを「UTF-8指定」と同じ意味では扱わず、読み取り側も合わせて確認してください。また、既存の同名ログを上書きする指定なので、保存先にも注意が必要です。公式のログオプション一覧で仕様を確認できます。

コピー処理を含む手順は、robocopyの使い方とログの確認方法で紹介しています。文字化け調査のために、本番のコピー処理を繰り返す必要はありません。

なお、cmd /uは出力形式に関係する指定です。BATの入力ファイルをUTF-8として読み取るための万能な指定ではなく、外部プログラムの出力形式まで統一するものでもありません。cmdの公式仕様を確認し、出力するコマンドごとに切り分けましょう。

それでも直らないときの確認項目

  • 別のBATを実行していないか:ファイル名と保存場所を確認する。拡張子が .bat.txt になっていないかも確認する
  • 日本語パスが原因か:まず半角英数字の検証用フォルダで短い表示例を試し、その後に日本語パスを分けて調べる
  • パスに空白がないか:パスを半角の二重引用符で囲み、実行場所も確認する
  • 別のBATを呼び出していないか:呼び出し先の保存形式も確認する
  • 外部プログラムだけ崩れるか:そのプログラムの対応文字コードと出力設定を調べる
  • 文字が「?」に置き換わって保存されていないか:コードページの切り替えでは復元できないため、元のファイルやバックアップを確認する

最初の対処として、Windows全体のシステムロケールや「ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用」の設定を変更することは勧めません。他のアプリにも関係するため、まずは検証用BATと専用のコマンドプロンプトで、原因を絞りましょう。

まとめ

バッチファイルが文字化けしたら、まず保存されたBAT・実行中のコンソール・出力されたログのどこで問題が起きているかを分けます。

  • エディターで読めない場合は、上書きせず、元の文字コードで開き直す
  • 実行時に崩れる場合は、保存形式とchcpの番号を合わせて確認する
  • ログだけ崩れる場合は、書き出す側と開く側の形式を確認する

chcpはファイルを変換するコマンドではありません。小さな表示例から確かめると、本番用BATを不用意に動かさずに調べられます。使うコマンドを増やしたい方は、バッチファイルの基本コマンド一覧、関連記事を探す場合はWindowsの便利機能ガイドを参考にしてください。