Programming Field

Chcp - DOS/コマンドプロンプト コマンド一覧

Change Codepage の略』

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

構文

chcp[.com] [nnn]
nnn
コードページを指定します。例えば、437 は英語、932 は日本語です。指定できるコードページについては解説の使用できるコードページをご覧ください。
省略すると、現在のコードページが表示されます。

解説

Chcp使用例

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

バッチファイル内でコードページの変更を行うと、バッチファイルが終了して残ったプロンプト上でも引き続きそのコードページが使用されます。一時的に変更した場合は必ず元に戻すための呼び出しをする必要があります。([Windows NT系] コードページの変更はSetlocalのローカル化の影響を受けず、Endlocalを使ってもリセットされません。)

[Windows NT系?/XP 以降] コードページはmode CON CODEPAGE SELECT=xxxでも変更することが可能です。Modeコマンドで変更した場合は画面クリアが行われないという違いがあります。

使用できるコードページ

[MS-DOS] 使用できるコードページは Config.sys に記述された COUNTRY 指定によって決まります。複数言語に対応する場合はそれに応じた COUNTRY データを読み込んでおく必要があります。

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

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

※ 1200 (UTF-16LE) は使用できません。

コードページと実際の出力

コマンドプロンプトは、ファイル・パイプの入力においてはChcpで指定されたコードページを使用しますが、出力においてはコマンドプロンプト実行時のcmd.exeに「/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として入力されます(それ以外のコマンドについては未確認)。

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

[Windows 11] Windows ターミナルでは4バイトのUTF-8も正しく表示されます。(Windows コンソール ホストでは表示できません。)

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

@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文字(以上)になるだけなので問題ありません。

関連項目