/Kod kodlama sayfa cmd.exe ne kullanıyorsun
Windows cmd.exe açtığımda, ne kodlama kullanıyor? Nasıl kullanmakta olduğu kontrol edebilir miyim? Bölge ayarı bağlı mı ya da herhangi bir ortamı kontrol etmek için değişken vardır?
Belirli bir kodlama ile dosya türü ne olacak? Bazen bozuk karakterler olsun (yanlış kodlama kullanılır) ve bazen bu tür işleri. Ancak her şey ne bilmiyorum sürece güvenmiyorum. Kim açıklayabilir?
CEVAP
Evet, sinir bozucu bazen type
ve diğer programlar.
yazdırma anlamsız, ve bazen onlar yok.
Öncelikle Unicode karakterleri sadece if the current console font contains the characters görüntüler. Yani kullanın TrueType yazı tipi varsayılan Tarama Yazı tipi yerine Konsol Lucida gibi.
Ama eğer konsol font görüntülemek için çalışıyorsun karakter içermeyen olsa, anlamsız yerine soru işaretleri görürsünüz. Anlamsız geldiğinde, sadece yazı tipi ayarlarını daha neler daha var.
Programlar C-kütüphane printf
gibi g/Ç fonksiyonları standart kullanınbu
programın çıkış kodlama konsolun çıkış kodlaması aynı olmalıdırya
anlamsız alacak. chcp
geçerli kod sayfasını gösterir Ayarlar. Tüm
çıkış standart C kitaplığı I/O fonksiyonları eğer ise olarak kabul edilir
kod sayfası chcp
ile gösterilir.
Programın çıkış konsol kodlama ile eşleşen çıktı kodlaması iki farklı şekilde yapılabilir:
Bir program konsol geçerli kod sayfası kullanarak
chcp
ya da alabilir 54* *ve kodlama çıkış için kendisini yapılandırmakSiz veya bir program konsol geçerli kod sayfası veya
chcp
kullanarak ayarlayabilirsiniz Programın varsayılan çıktı kodlaması maç içinSetConsoleOutputCP
.
Ancak win 32 gibi bazı programlar, UTF-16LE dizeleri doğrudan yazabilirsiniz
ile konsol
WriteConsoleW
.
Bu kod sayfaları ayarlamadan doğru çıktı almak için tek yoldur. Ve
bu fonksiyonu kullanmadan bile, eğer bir dize yoksa, UTF-16LE kodlama
başlamak için win 32 programı doğru kod sayfası geçmelidir
MultiByteToWideChar
.
Ayrıca, WriteConsoleW
program çıkış yönlendirilir eğer çalışmaz;
daha fazla işe yaramaz bu durumda gerekli.
type
Her bir dosya başlatmak için denetler, çünkü bazı zamanlar çalışıyor
UTF-16LE Byte Order Mark
(BOM), yani 0xFF 0xFE
bayt.
Eğer böyle bir bulursa
mark, dosya Unicode karakterleri WriteConsoleW
kullanarak görüntüler
geçerli kod sayfası ne olursa olsun. Ama ne zaman type
ıng herhangi bir dosya
UTF-16LE BOM, ya da kullanmak için ASCII olmayan herhangi bir komut ile karakter
WriteConsoleW
—ayarlamak gerekir aramıyor
kod ve program çıktı birbirlerine maç için kodlama konsol.
Bunu nasıl öğrenebiliriz?
İşte test dosyası Unicode karakterler içeren:
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
Burada farklı bir sürü test dosyasını yazdırmak için bir Java programı.
Unicode kodlama. Herhangi bir programlama dili; sadece baskı olabilir
stdout
karakter veya bayt ASCII kodlanmış.
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();
}
}
}
}
Varsayılan kod sayfası çıktı?Toplam çöp!
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}
Ancak, 29 ** kurtardığını dosyalar varsa? Tam içerdikleri konsola yazdırılan aynı bayt.
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 õ¢áÕÑ¢
sadeceçalışan şeyi UTF-16LE dosyası bir BOM ile yazdırılır
type
ile konsola.
Eğer bir şey yazdırmak için type
dışında kullanırsak dosya, çöp elde ederiz
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 doğru görüntülemiyor aslında, biz
type
komut UTF-16LE bir malzeme listesi de tespit etmek için mantık sonucuna varmak
dosyanın başlangıç ve özel yazdırmak için Windows API kullanır.
type
gittiği zaman bir hata ayıklayıcı cmd.exe
açarak görebiliriz
çıktı dosyası:
type
bir dosya açıldıktan sonra, 0xFEFF
—yani, bir BOM denetler bayt
0xFF 0xFE
eğer böyle bir malzeme listesi varsa, type
küçük-indian—ve ayarlar
iç fOutputUnicode
bayrak. Bu bayrak daha sonra karar vermek için kontrol edilir
arama olup olmadığını 43**.
Ama bu dosyaları tek çıkış Unicode için type
almak için tek yolu bu
bu malzeme listeleri ve UTF-16LE. Programları için dosyaları için, ve
bu dosyalarınızı olacak çıkış kolu konsolu için özel bir kod yok
geçerli kod sayfası göre yorumlanır ve muhtemel olarak görünecektir
anlamsız.
type
Unicode kendi programları konsolu için çıkışları nasıl böyle taklit edebilirsiniz:
#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;
}
Bu program Windows konsolunu kullanarak Unicode yazdırma için çalışıyor varsayılan kod sayfası.
Örnek Java programı için, doğru çıktı biraz oluruz çıktı, garip bir şekilde sarpa sarıyor ama el ile kod sayfası ayarı:
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
…
Ancak, bir Unicode UTF-8 adet C programı sayfası:
#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;
}
doğru çıktı:
Z:\andrew\projects\sx\1259084>.\test
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
Hikayenin ahlaki?
type
BOM geçerli kod sayfası ne olursa olsun ile UTF-16LE dosyaları yazdırabilirsiniz- Win32 programları çıktı Unicode kullanarak konsola programlanabilir
WriteConsoleW
. - Kod sayfasını ayarlamak ve buna göre çıktı kodlama üzerinde baskı Unicode kod sayfası program başladığında ne olursa olsun konsol ayarlamanızı sağlayan diğer programlar
- Her şey için etrafında
chcp
ile uğraşmak zorunda kalacak ve muhtemelen hala garip çıktı.
HTML kodlama sorunları "A" k...
Nasıl iki açısal uygulamaları tanımlam...
Objective-C url kodlama...
Tüm CSS sayfa yükleme hızını optimize ...
Nasıl bir dosya değiştirmek'vim i...