[解決済み】cmd.exeが使用しているエンコーディング/コードページは何ですか?
質問
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
そして、おそらくまだ奇妙な出力が得られるでしょう。
関連
-
[解決済み] C:\WINDOWS ASSEMBLYの中にあるものは何?[閉店]
-
Windows2008 スケジュールタスク、エラー追加データ。エラーの値: 2147750687。
-
[解決済み] XAMPP Object not foundエラー
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] Base64エンコーディングは何に使うのですか?
-
[解決済み] Windowsのコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?
-
[解決済み] クエリ文字列パラメータのJava URLエンコーディング
-
[解決済み】Node.jsでBase64エンコードを行うにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】exec: "gcc": go buildしようとすると%PATH%に実行可能ファイルが見つからない
-
[解決済み] Ctrl Alt F8はディスプレイを切り離す?
-
[解決済み] NERDTreeで隠しファイル(ピリオドで始まる)を表示するにはどうしたらいいですか?
-
[解決済み] 旧バージョンのRubyを削除する(Windowsの場合)
-
[解決済み] 設定ファイルを開くことができません。Windowsの/usr/local/ssl/openssl.cnf [重複] を開くことができません。
-
マイクロソフトのエラーコード
-
[解決済み] docker-machine: マシン名がない、"default" が存在しない
-
[解決済み] cmd lineを使用してファイルをZIPする方法は?
-
[解決済み] バッチプログラムでのechoコマンドの動作について
-
[解決済み] git cloneです。<URL> の認証に失敗しました。