1. ホーム
  2. ウィンドウズ

[解決済み】cmd.exeが使用しているエンコーディング/コードページは何ですか?

2022-04-18 04:12:08

質問

Windowsでcmd.exeを開くと、どのようなエンコーディングで表示されますか?

現在使用しているエンコードを確認するにはどうしたらよいですか?それは私の地域設定に依存するのでしょうか、それとも確認するための環境変数があるのでしょうか?

特定のエンコーディングでファイルを入力するとどうなりますか?文字化け(使用されているエンコーディングが正しくない)することもあれば、なんとなくうまくいくこともあります。しかし、何が起こっているのか分からない以上、何も信用できません。どなたか説明していただけませんか?

解決方法は?

そうですね、イライラしますよね。 type その他のプログラム が印刷されたり、されなかったりします。

まず、ユニコード文字が表示されるのは もし 現在のコンソールフォントに含まれる文字 . そのため デフォルトのラスターフォントではなく、Lucida ConsoleのようなTrueTypeフォントを使用してください。

しかし、コンソールフォントに表示しようとする文字が含まれていない場合。 という疑問符が表示されます。ちんぷんかんぷんなときは フォントの設定だけでなく、もっといろいろなことが起こっているはずです。

のようなCライブラリの標準的なI/O関数を使用する場合。 printf , そのため プログラムの出力エンコーディングは、コンソールの出力エンコーディングと一致しなければなりません。 でなければ という文字が表示されます。 chcp 現在のコードページを表示・設定します。すべての Cライブラリの標準的なI/O関数を使った出力は で表示されるコードページ chcp .

プログラムの出力エンコーディングとコンソールの出力エンコーディングを一致させる。 は、2つの異なる方法で達成することができます。

  • プログラムがコンソールの現在のコードページを取得するには chcp または GetConsoleOutputCP で、そのエンコーディングで出力するように自分自身を構成するか、あるいは

  • あなたやプログラムは、コンソールの現在のコードページを chcp または SetConsoleOutputCP を使えば、プログラムのデフォルトの出力エンコーディングに合わせることができます。

ただし、Win32 API を使用するプログラムでは、UTF-16LE 文字列を直接書き込むことができます。 を使用してコンソールに送信します。 WriteConsoleW . これは、コードページを設定せずに正しい出力を得るための唯一の方法です。また この関数を使っても、文字列のエンコーディングがUTF-16LEでない場合は に正しいコードページを渡さなければなりません。 MultiByteToWideChar . また WriteConsoleW は、プログラムの出力がリダイレクトされた場合には動作しません。 その場合は、さらに工夫が必要です。

type は、各ファイルの先頭をチェックするため、ある程度は動作します。 UTF-16LE バイトオーダーマーク (BOM) すなわち、バイト 0xFF 0xFE . もし、そのような マークを使用して、ファイル内の Unicode 文字を表示します。 WriteConsoleW 現在のコードページに関係なく しかし type のないファイルは UTF-16LE BOM、または非ASCII文字を使用するコマンドの場合 を呼び出さない WriteConsoleW -を設定する必要があります。 コンソールのコードページとプログラムの出力エンコーディングを一致させる。


これを調べるにはどうしたらいいのでしょうか?

ここに、ユニコード文字を含むテストファイルがあります。

ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

テストファイルをさまざまな形式で出力するJavaプログラムです。 Unicodeエンコーディング。これはどんなプログラミング言語でも可能です。 ASCII文字またはエンコードバイトを stdout .

import java.io.*;

public class Foo {

    private static final String BOM = "\ufeff";
    private static final String TEST_STRING
        = "ASCII     abcde xyz\n"
        + "German    äöü ÄÖÜ ß\n"
        + "Polish    ąęźżńł\n"
        + "Russian   абвгдеж эюя\n"
        + "CJK       你好\n";

    public static void main(String[] args)
        throws Exception
    {
        String[] encodings = new String[] {
            "UTF-8", "UTF-16LE", "UTF-16BE", "UTF-32LE", "UTF-32BE" };

        for (String encoding: encodings) {
            System.out.println("== " + encoding);

            for (boolean writeBom: new Boolean[] {false, true}) {
                System.out.println(writeBom ? "= bom" : "= no bom");

                String output = (writeBom ? BOM : "") + TEST_STRING;
                byte[] bytes = output.getBytes(encoding);
                System.out.write(bytes);
                FileOutputStream out = new FileOutputStream("uc-test-"
                    + encoding + (writeBom ? "-bom.txt" : "-nobom.txt"));
                out.write(bytes);
                out.close();
            }
        }
    }
}

デフォルトのコードページでの出力? 完全なゴミ!

Z:\andrew\projects\sx\1259084>chcp
Active code page: 850

Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢
= bom
´╗┐ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢
== UTF-16LE
= no bom
A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
 = bom
 ■A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
 == UTF-16BE
= no bom
 A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}
= bom
■  A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}
== UTF-32LE
= no bom
A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y
   = bom
 ■  A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y
   == UTF-32BE
= no bom
   A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}
= bom
  ■    A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

しかし、次のようにするとどうでしょう。 type 保存されたファイルは?そのファイルには コンソールに出力されたのと同じバイト数です。

Z:\andrew\projects\sx\1259084>type *.txt

uc-test-UTF-16BE-bom.txt


■  A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}

uc-test-UTF-16BE-nobom.txt


 A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}

uc-test-UTF-16LE-bom.txt


ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

uc-test-UTF-16LE-nobom.txt


A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y

uc-test-UTF-32BE-bom.txt


  ■    A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

uc-test-UTF-32BE-nobom.txt


   A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

uc-test-UTF-32LE-bom.txt


 A S C I I           a b c d e   x y z
 G e r m a n         ä ö ü   Ä Ö Ü   ß
 P o l i s h         ą ę ź ż ń ł
 R u s s i a n       а б в г д е ж   э ю я
 C J K               你 好

uc-test-UTF-32LE-nobom.txt


A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y

uc-test-UTF-8-bom.txt


´╗┐ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢

uc-test-UTF-8-nobom.txt


ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢

のみ UTF-16LEファイルで、BOM付きで、印刷されます。 コンソールで type .

以外のものを使用した場合 type を印刷すると、ゴミが出ます。

Z:\andrew\projects\sx\1259084>copy uc-test-UTF-16LE-bom.txt CON
 ■A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
         1 file(s) copied.

ということから copy CON は Unicode を正しく表示しないので という結論になります。 type コマンドは、UTF-16LE BOMを検出するロジックを持っています。 を印刷するために、特別なWindows APIを使用します。

を開くことで確認することができます。 cmd.exe になったとき、デバッガで type をファイルに出力します。

type ファイルを開くと、BOM が 0xFEFF -すなわち、バイト 0xFF 0xFE をリトルエンディアンで表現し、そのようなBOMがある場合。 type を設定します。 内部 fOutputUnicode のフラグを立てます。このフラグは後でチェックされ を呼び出すかどうか WriteConsoleW .

しかし、これだけでは type を出力することができます。 BOMを持ち、UTF-16LEであること。それ以外のファイルや、プログラム コンソール出力を処理する特別なコードがない場合、ファイルは 現在のコードページに従って解釈され、おそらくは ちんぷんかんぷん

をエミュレートすることができます。 type は、自分のプログラムの中で、次のように Unicode をコンソールに出力します。

#include <stdio.h>
#define UNICODE
#include <windows.h>

static LPCSTR lpcsTest =
    "ASCII     abcde xyz\n"
    "German    äöü ÄÖÜ ß\n"
    "Polish    ąęźżńł\n"
    "Russian   абвгдеж эюя\n"
    "CJK       你好\n";

int main() {
    int n;
    wchar_t buf[1024];

    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    n = MultiByteToWideChar(CP_UTF8, 0,
            lpcsTest, strlen(lpcsTest),
            buf, sizeof(buf));

    WriteConsole(hConsole, buf, n, &n, NULL);

    return 0;
}

このプログラムは、Windows コンソールで Unicode を印刷するために動作します。 デフォルトのコードページです。


サンプルのJavaプログラムでは、以下の方法で少し正しい出力が得られます。 を手動で設定すると、出力が変な方向に乱れてしまいますが。

Z:\andrew\projects\sx\1259084>chcp 65001
Active code page: 65001

Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好
ж эюя
CJK       你好
 你好
好
�
= bom
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好
еж эюя
CJK       你好
  你好
好
�
== UTF-16LE
= no bom
A S C I I           a b c d e   x y z
…

ただし、Unicode UTF-8のコードページを設定するC言語プログラム。

#include <stdio.h>
#include <windows.h>

int main() {
    int c, n;
    UINT oldCodePage;
    char buf[1024];

    oldCodePage = GetConsoleOutputCP();
    if (!SetConsoleOutputCP(65001)) {
        printf("error\n");
    }

    freopen("uc-test-UTF-8-nobom.txt", "rb", stdin);
    n = fread(buf, sizeof(buf[0]), sizeof(buf), stdin);
    fwrite(buf, sizeof(buf[0]), n, stdout);

    SetConsoleOutputCP(oldCodePage);

    return 0;
}

は正しく出力されます。

Z:\andrew\projects\sx\1259084>.\test
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好


モラルは?

  • type 現在のコードページに関係なく、BOM付きのUTF-16LEファイルを印刷することができます。
  • Win32 プログラムをプログラムして、Unicode をコンソールに出力することができます。 WriteConsoleW .
  • コードページを設定し、それに応じて出力エンコーディングを調整する他のプログラムは、プログラム起動時のコードページに関係なく、コンソールにユニコードを出力することができます
  • それ以外のものについては、以下のようにいじくり回す必要があります。 chcp そして、おそらくまだ奇妙な出力が得られるでしょう。