Programming Field

Chcp - DOS コマンド一覧

スポンサーリンク

Change Codepage の略』

現在のコードページ (言語) を変更します。

構文

chcp[.com] [nnn]
nnn
コードページを指定します。例えば、437 は英語、932 は日本語です。指定できるコードページは、システムが対応しているものに限られます。
省略すると、現在のコードページが表示されます。

解説

コードページの変更は、プロンプト上で表示可能な文字種だけでなく、ファイル入出力で使用される文字種にも影響を及ぼします。932(日本語 Shift JIS)と437(英語)を切り替えると表示が切り替わります(ただし入出力の文字種に変化はありません)。

[Windows XP?以降] 主に以下のコードページが使用できます(他のコードページが利用できる場合もあります)。ただしプロンプト上では932以外は英語で表示されます。

[Windows 10] コードページを切り替えた場合、(コマンドプロンプトで設定されたフォントが対応している場合)そのコードページに対応する文字が一部表示できます。例として、UTF-8では日本語も表示可能ですが、一部文字化けが発生する場合があります。また、4バイトのUTF-8文字は表示できない模様です。なお、各種コマンドのヘルプ表示はコードページが932でない場合英語で表示されます。

番号文字コード
437英語(OEMアメリカ)
932日本語(Shift JIS)
20932EUC-JP
50220JIS
65000UTF-7
65001UTF-8

コマンドプロンプトは、ファイル・パイプの入力においてはChcpで指定されたコードページを使用しますが、出力においては「/u」オプションが指定されているとUnicode(UTF-16)で出力します。

Chcpcmd /uスイッチ入力の扱い出力の扱い
932なしShift JIS※Shift JIS
20932なしEUC-JP※EUC-JP
65000なしUTF-7※UTF-7
65001なしUTF-8※UTF-8
932ありShift JISUTF-16
20932ありEUC-JPUTF-16
65000ありUTF-7UTF-16
65001ありUTF-8UTF-16

上記のうち「※」と付けたものに関しては、UTF-16のBOMが先頭に存在するとTypeコマンドとMoreコマンドでUTF-16として入力されます(それ以外のコマンドについては未確認)。

サンプル (バッチファイル)

@echo off
setlocal
setlocal enabledelayedexpansion
set TEMPLATE_FILE=D:\Data\Template\hoge.xml
set OUT_FILE=D:\MyData\bar.xml
set MY_VERSION=123

for /F "tokens=2 delims=:" %%P in ('chcp') do (
    set ACTIVE_CP=%%P
)

chcp 65001 > NUL

type NUL > "%OUT_FILE%"
for /F "usebackq delims=" %%t in ("%TEMPLATE_FILE%") do (
    set TEMP_LINE=%%t
    set TEMP_LINE=!TEMP_LINE:[version]=%MY_VERSION%!
    echo !TEMP_LINE!>> "%OUT_FILE%"
)

chcp %ACTIVE_CP% > NUL

[Windows NT系] [拡張構文] Forコマンドのサンプルにある、テンプレートファイルから一部文字を置き換えて新たなファイルを作成するサンプルを、UTF-8形式のファイルを扱えるようにしたバージョンです。Chcpで扱うコードページを「65001」(UTF-8)にすることで、入出力に使用される文字コードがUTF-8となるため、Shift JIS環境では文字化けする可能性のあったUTF-8形式のファイルを問題なく利用することができます。

なお、最初のForコマンドとChcpは、現在のコードページを取得して環境変数「ACTIVE_CP」に設定するための記述です。一通りの処理が終わった後にもう一度Chcpを呼び出してコードページを元に戻しておきます。

※ このForコマンドによる解析が有効であるのは、Chcpが現在のコードページを「現在のコードページ: 932」のように出力するためです。
※ 「ACTIVE_CP」には数値の前に空白文字が入る可能性がありますが、その場合でも「chcp %ACTIVE_CP%」を展開すると「chcp」と数値の間のスペースが2文字(以上)になるだけなので問題ありません。