文字コード・文字化け対策
コマンドプロンプトで日本語を扱っていると、文字化けに遭遇することがあります。特に UTF-8 のファイルを扱う場合や、他のプログラムの出力を処理する場合に頻発します。
この記事では、文字化けの原因とその対策について解説します。
文字化けが起きる原因
文字化けは、テキストを書いた側と読む側で異なる文字コードを使用しているために発生します。
Windows の日本語環境では、以下の文字コードが混在しています。
| 文字コード | コードページ | 説明 |
|---|---|---|
| Shift_JIS | 932 | Windows の日本語環境の既定値 |
| UTF-8 | 65001 | 現在のWeb・開発環境の主流 |
| UTF-16 | - | Windows の内部処理で使用 |
コマンドプロンプトの既定のコードページは 932(Shift_JIS) ですが、最近のテキストエディタやプログラムは UTF-8 を既定値として使用することが多く、この不一致が文字化けの主な原因です。
現在のコードページを確認する
chcp
コードページを変更する(chcp コマンド)
chcp コマンドでコードページを変更できます。
UTF-8 に変更
chcp 65001

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
Shift_JIS に戻す
chcp 932
chcp
で変更したコードページは、そのコマンドプロンプトウィンドウ内でのみ有効です。新しいウィンドウを開くと既定のコードページに戻ります。
バッチファイルの文字化け対策
対策 1: バッチファイルの保存時の文字コードに注意
バッチファイルは、コマンドプロンプトのコードページと同じ文字コードで保存する必要があります。
| 保存形式 | 動作 |
|---|---|
| ANSI(Shift_JIS) | 既定のコードページ 932 で正常動作 |
| UTF-8(BOM なし) | chcp 65001 と組み合わせて使用 |
| UTF-8(BOM 付き) | 先頭にゴミ文字が表示される場合あり |
バッチファイルを UTF-8 BOM 付きで保存すると、先頭に BOM(Byte Order Mark)が含まれるため、@echo off が正しく認識されない場合があります。UTF-8 で保存する際は BOM なし を選択してください。
対策 2: バッチファイル内で chcp を変更
UTF-8 のファイルを処理するバッチファイルでは、先頭でコードページを変更します。
@echo off
setlocal
rem 現在のコードページを控えてからUTF-8に変更
for /f "tokens=2 delims=:" %%a in ('chcp') do set ORIG_CP=%%a
chcp 65001 >nul
rem UTF-8のファイルを処理
type "utf8_data.txt"
rem コードページを元に戻す
chcp %ORIG_CP% >nul
endlocal
chcp の出力は表示言語によって文言が変わりますが、コロン(:)の後ろにコードページ番号が表示される点は共通なので、上記のように delims=: で取り出せます。元のコードページを控えておくと、932 を直書きせずに確実に復元できます。
chcp 65001 >nul のように >nul を付けることで、「現在のコード ページ: 65001」というメッセージの表示を抑制できます。
日本語を含む UTF-8 のバッチファイルを chcp 65001 で実行すると、Windows 10 の古いバージョンなどでラベルや goto が正しく解釈されないことがあります。配布するバッチファイルや動作環境が不明な場合は、次の対策 3 の Shift_JIS 保存が安全です。
対策 3: Shift_JIS で保存する
バッチファイル自体に日本語を含む場合、最も確実な方法はバッチファイルを Shift_JIS(ANSI) で保存することです。
Visual Studio Code を使用している場合は、右下のエンコーディング表示をクリックし、「エンコード付きで保存」から「Japanese (Shift JIS)」を選択します。
システム全体で UTF-8 を既定にする設定
Windows 10 バージョン 1803 以降(Windows 11 を含む)では、地域の設定から OS 全体の既定を UTF-8 にできます。
- 「設定」→「時刻と言語」→「言語と地域」→「管理用の言語の設定」を開く(
intl.cplを実行しても開けます) - 「管理」タブの「システム ロケールの変更」を選択する
- 「ベータ: ワールド ワイド言語サポートで Unicode UTF-8 を使用」にチェックを入れて再起動する
この設定を有効にすると、Shift_JIS を前提とした古いアプリケーションやバッチファイルが文字化けする可能性があります。影響範囲が大きいため、まずは chcp や保存形式の調整で解決できないかを検討してください。
よくある文字化けのケースと対策
ケース 1: type コマンドで UTF-8 ファイルが文字化けする
chcp 65001 >nul
type "utf8_file.txt"
chcp 932 >nul
ケース 2: findstr で日本語が検索できない
findstr はシステムのコードページを使用するため、UTF-8 のファイルに対する日本語検索は正しく動作しない場合があります。
chcp 65001 >nul
findstr "キーワード" "utf8_file.txt"
chcp 932 >nul
PowerShell を使う場合は、エンコーディングを明示すると確実です。
powershell -NoProfile -Command "Select-String -Path utf8_file.txt -Pattern 'キーワード' -Encoding utf8"
findstr の UTF-8
対応は完全ではなく、正規表現を使用した日本語のパターン検索では正しく動作しない場合があります。信頼性の高い
UTF-8 テキスト検索が必要な場合は、PowerShell の Select-String
コマンドレットの使用を検討してください。
ケース 3: 他のプログラムの出力が文字化けする
Python や Node.js など、UTF-8 を既定値とするプログラムの出力が文字化けする場合があります。
chcp 65001 >nul
python script.py
chcp 932 >nul
あるいは、環境変数でプログラム側の出力エンコーディングを設定する方法もあります。
set PYTHONIOENCODING=utf-8
python script.py
この設定は Python が UTF-8 で出力するようにするものです。パイプやファイルへの出力では有効ですが、コンソールのコードページが 932 のままだと画面上では文字化けします。
ケース 4: リダイレクトで作ったファイルが文字化けする
Windows PowerShell 5.1 では、リダイレクト(>)で保存したファイルが UTF-16 になります。そのファイルを他のツールで開くと文字化けしたり、1 文字ごとに空白が入って見えたりします。
PowerShell で保存する場合は、Out-File -Encoding utf8 や Set-Content -Encoding utf8 のようにエンコーディングを明示してください。なお、Windows PowerShell 5.1 の -Encoding utf8 は BOM 付きで保存されます。
ケース 5: バッチファイルの echo が文字化けする
バッチファイル自体の保存文字コードと、コマンドプロンプトのコードページが不一致の場合に発生します。
バッチファイルの保存形式をコマンドプロンプトのコードページに合わせてください。
フォントの設定
一部の文字が表示されない場合、コマンドプロンプトのフォント設定が原因の可能性があります。
- コマンドプロンプトのタイトルバーを右クリック
- 「プロパティ」を選択
- 「フォント」タブで「MS ゴシック」や「Consolas」を選択
Windows Terminal(Windows 11 22H2 以降では既定のターミナル)は、UTF-8 の表示に優れています。文字化けが頻発する場合は、Windows Terminal の使用を検討してください。
まとめ
| 問題 | 対策 |
|---|---|
| UTF-8 ファイルの表示が化ける | chcp 65001 でコードページを変更 |
| バッチファイルの日本語が化ける | Shift_JIS で保存する |
| 他プログラムの出力が化ける | chcp 65001 またはプログラム側設定 |
| findstr で日本語検索できない | コードページ変更または PowerShell 利用 |
| BOM 付き UTF-8 の問題 | BOM なし UTF-8 で保存 |
文字化けの多くは、書く側と読む側の文字コードを一致させることで解決できます。