現在の Windows では、コードページ指定をすればコマンドラインで UTF-8 を書くことができます。
そこで、バッチファイルを UTF-8 で書く際に気をつけるべき点をご紹介します。
コードページを変更する
コードページは、特定の文字コードを表す Windows 特有の番号で、SJISは 932、UTF-8 は 65001 です。
コードページを変更する為、バッチファイルの先頭で chcpコマンドを指定します。
@echo off
chcp 65001
改行コード
バッチファイルを UTF-8 で保存するとき、改行コードを LF (Unix形式)にしてしまいたくなりますが、これだと上手く動作しない場合があります。
改行コードは必ず、CR+LF (Windows形式)で保存しましょう。
対応フォントを指定
文字化けを防ぐ為に、コマンドプロンプトのプロパティ(または既定値)の「フォント」タブで、UTF-8 の表示に対応した等幅フォントを指定します。
「MSゴシック」や「MyricaM M」が対応しているようです。なお、残念ながら Microsoft 製の視認性が高い等幅フォント Consolas は対応していません。
表示できない文字もある
絵文字や外国語など、日本語の文字コードには無い文字は、上手く表示できないようです。指定したフォントには該当文字が存在しない為だろうと思います。
しかしコードページ指定が全く無意味なわけではなく、コードページに従って内部処理は正常に行われています。その為、Unicode の文字列をコマンドでアプリケーションに渡したり、リダイレクトでファイルに書き込むことが出来るようになります。
なお、コードページ 932 のままでも一部の Unicode 文字は表示されますが、ファイルに書き込む等すると文字化けします。
PowerShellの場合
PowerShellではコードページ 932 と 65001 の何れでも、echo コマンドなどをリダイレクトしてファイルに保存すると、UTF-16LE(BOM付き)として出力されます。
また、コマンドプロンプトでは 932 のままだと文字化けするようなケースでも、PowerShell だと上手く動作する場合がありますが、65001 に変更したほうが確実に動作しますので、それについては省略します。
※ 全て2018年04月時点の Windows 10 (64bit) で確認しました。