背景
バッチファイルでecho
やディレクトリに日本語を使って処理させたとき、文字化けしてしまう
開発環境
- Windows11 Pro
- Version:23H2
- OS Build:22631.5189
検証
おそらく文字コードが原因だろうと踏んで、文字コード設定を調べてみることにしました。
コマンドプロンプト上でchcp
コマンドを実行したところ、コードページ番号は「932」と表示されました。
対応表によるとコマンドプロンプトでデフォルトで設定されている文字コードは「Shift_JIS」になります。(日本語版のOSであれば大体はこの文字コードに設定されていると思います)
※各コードページと文字コードの対応表は こちら に記載されています。
アプリケーション側で設定した文字コードがコマンドプロンプトの文字コード設定に影響するのかを調べてみます。
メモ帳で「chcp_chk.bat」を作成し、メモ帳側の文字コードを「UTF-8」で保存して実行してみます。
@echo off
chcp
pause
実行結果は、「現在のコードページ:932」と表示されました。
同様に「chcp_chk (2).bat」を作成し、「ANSI」で保存。実行しても同じ結果となりました。
当たり前といえば当たり前ですが、あくまでアプリケーション側はアプリケーション側の設定であってコマンドプロンプト側の文字コード設定には影響しないということになります。
余談
「ANSI」でエンコードしたバッチファイルはchcp
コマンドで文字コードを指定しなくても文字化けせずに正常に表示されます。
試しに先ほどの2つのバッチファイルに echo テスト
を追加して実行してみます。
このようになぜ「ANSI」だと正常に表示されるのか。これについては「Shift_JIS」は ANSIコード を基に作られているからです。
この2つの違いについて、ぶっちゃけてしまうと「国際規格」か「日本規格」かの違いだけです。
「JISコード」には半角コードと共存する上で問題があったため、ANSIコードを「Shift_JIS」として採用したようです。
原因
コマンドプロンプト側で設定されている文字コードとアプリケーション側で設定している文字コードの違いにより現象が起きている。
対策
-
chcp
コマンドで文字コードを指定する
この対策が無理に環境を変えずに実施できるかと思います。
文字コードを指定する場合はchcp
の後ろにコードページ識別子
を指定すればいいです。
例)chcp 65001
(文字コード「UFT-8」の場合)
- 「ANSI」でエンコードする
荒業ですが「Shift_JIS」を使用している以上は不都合はないかと思ってます。
- 日本語を使用しない
これも極端な対策ですが、「ASCII」や「Unicode」「UFT-8」など互換性のある国際規格を使用するのであればこちらも不都合はないと思います。
ですが、環境によっては可読性が落ちる場合もあるのでプロジェクトで開発を行なっている場合は注意が必要です。
まとめ
文字コードの違いにより文字化けが起こる現象は、バッチファイルに限らず電子データを取り扱う上で共通して言えることですので、エンコーディング設定も気にかけてコーディングしましょう。(自戒の念も込めて)
どの文字コードを指定するかについては極論なんでもいいと思ってます。エンコードする文字コードが統一されていればいいので。
初歩的な内容ではありますが、なんとなく知ってるだけに見落としてしまう原因だなと改めて思いました。