SORU
11 AĞUSTOS 2009, Salı


/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
18 HAZİRAN 2013, Salı


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ırmak

  • Siz veya bir program konsol geçerli kod sayfası veya chcp kullanarak ayarlayabilirsiniz Programın varsayılan çıktı kodlaması maç için SetConsoleOutputCP.

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 0xFEbayt. Eğer böyle bir bulursa mark, dosya Unicode karakterleri WriteConsoleWkullanarak 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.

typegittiği zaman bir hata ayıklayıcı cmd.exe açarak görebiliriz çıktı dosyası:

enter image description here

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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • edwin maldonado

    edwin maldon

    28 Mart 2009
  • ELawshea

    ELawshea

    26 Mayıs 2008
  • Floortile83

    Floortile83

    16 Ocak 2010