Image: コマンドプロンプトでUnicode(UTF-8,UTF-16)を扱う

Windows日本語版のコマンドプロンプトでは標準だとコードページ932(正確にはWindows-31J、俗にはシフトJIS)が使われています。この場合、標準入出力もCP932として扱われるため、例えばUnicodeのテキストファイルに対してtype hoge.txtなどと実行するとコマンドはテキストファイルをシフトJISとして解釈し、出力は文字化けします。

UTF-8はコードページ65001、UTF-16LEはコードページ850で扱うことができます。コマンドプロンプトでコードページを変更するにはchcp 65001chcp 850を実行します。ただし注意点が2つあります。

例えば次のような内容のテキストファイルがあるとします。

العربية,Bahasa Indonesia,Bahasa Melayu,Български,Català,Čeština
,Dansk,Deutsch,Eesti,Ελληνικά,Español,Esperanto,Euskara,فارسی
,Français,Galego,한국어,עברית,Hrvatski,Italiano,ქართული,Latviešu,Lietuvių
,Magyar,Nederlands,日本語,Norsk bokmål,Norsk nynorsk,Polski,Português
,Română,Русский,Slovenčina,Slovenščina,Српски / srpski
,Srpskohrvatski / српскохрватски,Suomi,Svenska,ไทย
,Tiếng Việt,Türkçe,Українська,中文

これをTYPEコマンドでコンソールに出力してみます。

CP932(Shift-JIS)
Image:CP932 UTF-8 output

コードページを65001に変更して同じコマンドを実行してみます。

CP65001(UTF-8)
Image:CP65001 UTF-8 output

標準設定ではUnicodeに切り替えるとフォントが欧文フォントになるため、コンソールに出力される日本語メッセージは文字化けして表示されません。コマンド内部ではちゃんと処理されているので処理を実行したいだけであれば問題ありませんが、日本語メッセージを文字化けせずに表示させたい場合はフォントを変更する必要があります。なお、この状態でバッチファイルでechoコマンドを使って日本語メッセージを出力しようとすると、「The system cannot write to the specified device.」と表示されます。

コードページ932にした状態でコマンドプロンプトのプロパティを開き、「フォント」タブでフォントを「MSゴシック」に変更します。常にフォントを「MSゴシック」としたい場合は「既定値」のプロパティで設定します。
Image:Command prompt properties output

CP65001(UTF-8) - フォントはMSゴシック
Image:CP65001 UTF-8 output - MS Gothic

日本語文字、ギリシャ文字、ロシア文字は正常に表示されるようになりましたが、MSゴシックがカバーしていないアラビア文字などは依然文字化けしています。

Unicodeのコードページでバッチファイルを実行する場合は、バッチファイルのエンコードをUnicodeとして保存する必要があります。特にバッチファイル内でコードページを変更する場合は注意を要します。

バッチファイルの実行中は処理単位毎にバッチファイルからテキストデータを読み取るため、コードページを変更するとその時点でバッチファイルもそのコードページで解釈されます。

chcp 932
echo.バッチファイルをシフトJISで保存しないとこのメッセージは正しく表示されません
pause
chcp 65001
echo.バッチファイルをUTF-8で保存しないとこのメッセージは正しく表示されません
pause

コマンドプロンプトはシンプル・軽量ですが、入出力機能と柔軟性が乏しいので、ファイル入出力や多言語対応には向いていません。Unicodeのテキストファイル処理にはPowerShellのGet-ContentやOut-Fileコマンドレットを使うべきです。


comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.

(C) 2008-2017 akm. This blog theme is based on sakmug. Hosted by Xdomain