Cmd.exe hangi kodlama / kod sayfası kullanıyor?


271

Windows'ta cmd.exe dosyasını açtığımda hangi kodlamayı kullanıyor?

Şu anda hangi kodlamayı kullandığını nasıl kontrol edebilirim? Bölgesel ayarıma bağlı mı yoksa kontrol edilecek ortam değişkenleri var mı?

Belirli bir kodlamaya sahip bir dosya yazdığınızda ne olur? Bazen bozuk karakterler alıyorum (yanlış kodlama kullanılıyor) ve bazen işe yarıyor. Ancak neler olduğunu bilmediğim sürece hiçbir şeye güvenmiyorum. Birisi açıklayabilir mi?

Yanıtlar:


389

Evet, sinir bozucu - bazen typeve diğer programlar anlamsız yazdırıyor, bazen de yazdırmıyor.

Her şeyden önce, Unicode karakterler yalnızca geçerli konsol yazı tipi karakter içeriyorsa görüntülenir . Bu nedenle, varsayılan Raster Yazı Tipi yerine Lucida Konsolu gibi bir TrueType yazı tipi kullanın.

Ancak konsol yazı tipi görüntülemeye çalıştığınız karakteri içermiyorsa anlamsızca soru işaretleri görürsünüz. Anlamsızlaştığınızda, yazı tipi ayarlarından daha fazlası olur.

Programları gibi standart C-kütüphane I / O fonksiyonlarını kullandığınızda printf, programın çıkış kodlama Konsolun çıkış kodlamasını aynı olmalıdır , yoksa anlamsız olacaktır. chcpgeçerli kod sayfasını gösterir ve ayarlar. Standart C kitaplığı G / Ç işlevlerini kullanan tüm çıktılar, görüntülenen kod sayfasındaymış gibi işlenir chcp.

Programın çıktı kodlamasını konsolun çıktı kodlamasıyla eşleştirmek iki farklı şekilde gerçekleştirilebilir:

  • Bir program chcpveya kullanarak konsolun geçerli kod sayfasını alabilir GetConsoleOutputCPve kendisini bu kodlamada çıkış yapacak şekilde yapılandırabilir veya

  • Siz veya bir program, programın varsayılan çıkış kodlamasını chcpveya SetConsoleOutputCPile eşleştirmek için konsolun geçerli kod sayfasını ayarlayabilirsiniz .

Ancak, Win32 API'leri kullanan programlar UTF-16LE dizelerini doğrudan konsola yazabilir WriteConsoleW. Kod sayfalarını ayarlamadan doğru çıktı almanın tek yolu budur. Ve bu işlevi kullanırken bile, başlangıçta UTF-16LE kodlamasında bir dize yoksa, bir Win32 programının doğru kod sayfasını geçmesi gerekir MultiByteToWideChar. Ayrıca, WriteConsoleWprogramın çıktısı yeniden yönlendirilirse çalışmaz; bu durumda daha fazla uğraşmaya ihtiyaç vardır.

typezaman zaman çalışır çünkü her dosyanın başlangıcını UTF-16LE Bayt Sırası İşareti (BOM) , yani bayt bakımından kontrol eder 0xFF 0xFE. Böyle bir işaret bulursa WriteConsoleW , geçerli kod sayfasından bağımsız olarak dosyadaki Unicode karakterlerini görüntüler . Ancak typeUTF-16LE BOM'su olmayan herhangi bir dosyayı ayarlarken veya çağırmayan herhangi bir komutla ASCII olmayan karakterler kullanırken WriteConsoleW— konsol kod sayfasını ve program çıktı kodlamasını birbiriyle eşleşecek şekilde ayarlamanız gerekir.


Bunu nasıl bulabiliriz?

Unicode karakterleri içeren bir test dosyası:

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

İşte test dosyasını bir dizi farklı Unicode kodlamasında yazdırmak için bir Java programı. Herhangi bir programlama dilinde olabilir; yalnızca ASCII karakterlerini veya kodlanmış baytları yazdırır 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();
            }
        }
    }
}

Varsayılan kod sayfasındaki çı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, typekaydedilen dosyalar biz olsaydı ? Konsola yazdırılanla aynı baytları içerirler.

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       õ¢áÕÑ¢

Çalışan tek şey, konsola BOM ile basılan UTF-16LE dosyasıdır type.

typeDosyayı yazdırmak dışında bir şey kullanırsak , çöp alırız:

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 CONUnicode'u düzgün görüntülememesi gerçeğinden , typekomutun dosyanın başlangıcında bir UTF-16LE Malzeme Listesini tespit etmek için mantığı olduğu ve yazdırmak için özel Windows API'leri kullandığı sonucuna varabiliriz .

Bir dosya cmd.exeçıktığında bir hata ayıklayıcıda açarak bunu görebiliriz type:

resim açıklamasını buraya girin

typeBir dosyayı açtıktan sonra , bir malzeme listesi ( 0xFEFFyani, 0xFF 0xFEküçük endiandaki baytlar ) olup olmadığını denetler ve böyle bir Malzeme Listesi varsa, typedahili bir fOutputUnicodebayrak ayarlar . Bu bayrak daha sonra aranıp aranmayacağına karar vermek için kontrol edilir WriteConsoleW.

Ancak bu, typeUnicode çıktısını almanın tek yoludur ve yalnızca BOM'ları olan ve UTF-16LE'de olan dosyalar için. Diğer tüm dosyalar ve konsol çıktısını işlemek için özel kodu olmayan programlar için dosyalarınız geçerli kod sayfasına göre yorumlanacak ve muhtemelen anlamsız görünecektir.

Aşağıdaki typegibi kendi programlarınızda Unicode'un konsola nasıl çıkış yaptığını 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, varsayılan kod sayfasını kullanarak Windows konsolunda Unicode yazdırmak için çalışır.


Örnek Java programı için, kod sayfasını manuel olarak ayarlayarak biraz doğru çıktı alabiliriz, ancak çıktı garip yollarla berbat olur:

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, Unicode UTF-8 kod sayfasını ayarlayan bir C programı:

#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ıya sahip:

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

Hikayenin ahlakı?

  • type geçerli kod sayfanızdan bağımsız olarak bir Malzeme Listesiyle UTF-16LE dosyalarını yazdırabilir
  • Win32 programları kullanarak Unicode konsoluna çıktı programlanabilir WriteConsoleW.
  • Kod sayfasını ayarlayan ve çıkış kodlamasını buna göre ayarlayan diğer programlar, program başlatıldığında kod sayfasının ne olduğuna bakılmaksızın konsolda Unicode yazdırabilir
  • Diğer her şey için uğraşmak zorunda chcpkalacaksınız ve muhtemelen tuhaf çıktı alacaksınız.

73
Vay, bu SO'da gördüğüm en ayrıntılı cevap olmalı. Disasembly baskılar ve çok dilli skillz için ekstra kredi! Çok güzel, efendim!
hava saldırısı

2
Ayrıca, VS2008'de tanıtılan Microsoft'a özgü _setmode (_fileno (stdout), _O_U16TEXT) uzantısını da incelemek isteyebilirsiniz. Bkz. Stackoverflow.com/a/9051543 ve stackoverflow.com/a/12015918 ve msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.90).aspx _setmode () ve SetConsoleOutputCP (), her iki yaklaşımda da ilk bakışta tam olarak anlaşılmayan başka incelikler ve yan etkiler de olabilir. Andrewdotn cevabını _setmode (fd, _O_U16TEXT) ile ilgili herhangi bir gözlemle güncelleyebilseydi, bu harika olurdu.
JasDev

13
Bu mükemmel bir yanıt olsa da, konsolun UTF-16'yı desteklediğini söylemek yanıltıcı. UCS-2 ile, yani temel çok dilli düzlemdeki (BMP) karakterlerle sınırlıdır. Win32 konsol sunucusu (günümüzde conhost.exe) 1990 dolaylarında tasarlandığında, Unicode 16 bitlik bir standarttı, bu nedenle konsol ekran arabelleği karakter hücresi başına bir 16 bit WCHAR kullanıyor. UTF-16 vekil çifti iki kutu karakteri olarak yazdırılır.
Eryk Sun

3
@ user200783, ayrıştırılmış form desteklenmez; genellikle bir NFC eşdeğerine dönüşebilir. Ayrıca, Batı yerel ayarlarındaki konsol tam genişlikte ve yarım genişlikte gliflerin karıştırılmasına izin vermez. Ayrıca, kod sayfası 65001'i (UTF-8) kullanırken, Windows 8'den önce WriteFilebayt sayısı yerine yazılan karakter sayısını bildirir, bu nedenle arabelleğe alınmış yazarlar ASCII olmayan karakter sayısıyla orantılı olarak 'kalan' baytları birkaç kez yeniden dener . Ayrıca 65001'de, çağrılırken UTF-16 kodu başına 1 ANSI bayt olduğu varsayıldığından, ASHII olmayan karakterlerin okunması conhost.exe'de başarısız olur WideCharToMultiByte.
Eryk Paz

2
Bu yanıttaki basit demo programları GetStdHandle(STD_OUTPUT_HANDLE)ve C'nin stdoutkonsol tutamakları olduğunu varsayar . Uygulamada, bir konsolu test etmek için GetConsoleModebaşarılı olup olmadığını kontrol edin . Ayrıca, _isattydüşük bir G / Ç dosya tanımlayıcısının bir konsol olup olmadığını kontrol etmek için C çalışma zamanı işlevini kullanmayın ; NULdiğerlerinin de aralarında bulunduğu bir karakter modu cihazı olup olmadığını kontrol eder . Bunun yerine _get_osfhandlekolu doğrudan arayın ve kontrol edin.
Eryk Sun

29

tip

chcp

mevcut kod sayfanızı görmek için (Dewfy'ın daha önce söylediği gibi).

kullanım

nlsinfo

yüklü tüm kod sayfalarını görmek ve kod sayfası numaranızın ne anlama geldiğini öğrenmek için.

Kullanmak için Windows Server 2003 Kaynak Seti yüklü olmalıdır (Windows XP'de çalışır) nlsinfo.


19
İlginçtir, nlsinfoWindows 7'de görünmüyor.
Joey

2
nlsinfoWindows XP SP3 makinemde de mevcut değil.
Thomas Owens

2
Üzgünüm. Bence Windows Server Kaynak Seti araçlarıyla geliyor. Daha önce Windows XP SP3 makinemde birkaç kez kullandım ve varsayılan olarak yüklenmediğini bilmiyordum.
Çağdaş Altınkaya

Ah, bu Vista makinesinde neden orada kurduğumu açıklıyor.
Joey

4
nlsinfoWindows 10E makinesinde de mevcut değildir.
Yousha Aleayoub

21

İkinci sorgunuzu cevaplamak için kodlamanın nasıl işlediğini söyleyen Joel Spolsky bu konuda harika bir giriş yazısı yazdı . Kesinlikle önerilir.


13
Ben okudum ve biliyorum. Ancak, Windows'ta her zaman kaybolmuş hissediyorum çünkü işletim sistemi ve çoğu uygulama kodlamadan tamamen habersiz görünüyor.
danglund

5

Komut CHCP geçerli kod sayfasını gösterir. Üç basamaklı: 8xx ve Windows 12xx'dan farklı. Bu nedenle, yalnızca İngilizce bir metin yazdığınızda herhangi bir fark görmezsiniz, ancak genişletilmiş bir kod sayfası (Kiril gibi) yanlış yazdırılır.


5
CHCP ne sadece 3 hane göstermez ne de 8 ## biçimindedir. 437 örneğin bir ABD kodlamasıdır ve İngiliz sistemlerinde defacto standardıdır. - 65001 bir Unicode kodlamasıdır (doğru hatırlıyorsam UTF-8 ve 65000 UTF-7'dir) ve seçilebilir. Ayrıca CMD örneğin 1250 kod sayfasına geçmek için izin verir, ancak bu kod sayfaları seçilebilir beri bilmiyorum. (Win7 altında.)
Adam LS

4

Windows kod sayfası sorunları ve C programlarının taşınabilirliği ve yerelleştirme sorunları nedeniyle uzun süredir hayal kırıklığına uğradım. Önceki gönderiler sorunları ayrıntılı olarak açıkladı, bu yüzden bu konuda hiçbir şey eklemeyeceğim.

Uzun bir hikaye kısaca yapmak için, sonunda kendi UTF-8 uyumluluk kitaplığı katmanımı Visual C ++ standart C kitaplığı üzerine yazdı. Temel olarak bu kütüphane, standart bir C programının UTF-8'i dahili olarak kullanarak herhangi bir kod sayfasında doğru çalışmasını sağlar.

MsvcLibX adı verilen bu kütüphane, açık kaynak olarak https://github.com/JFLarvoire/SysToolsLib adresinde bulunmaktadır . Ana Özellikler:

  • Normal char [] C dizeleri ve standart C kitaplığı API'leri kullanılarak UTF-8'de kodlanan C kaynakları.
  • Herhangi bir kod sayfasında, her şey, kodunuzda, main () rutin argv [] dahil olmak üzere dahili olarak UTF-8 olarak işlenir ve standart giriş ve çıkış otomatik olarak doğru kod sayfasına dönüştürülür.
  • Tüm stdio.h dosya işlevleri, aslında 64 KBayt'a kadar olan 260 karakterden büyük UTF-8 yol adlarını destekler.
  • Aynı kaynaklar, Visual C ++ ve MsvcLibX ve Visual C ++ C kitaplığını kullanarak Windows'ta ve #ifdef ... #endif bloklarına gerek kalmadan gcc ve Linux standart C kitaplığını kullanarak Linux'ta başarıyla derlenebilir ve bağlanabilir.
  • Eklentiler, Linux'ta yaygın olan ancak Visual C ++ ile eksik olan dosyaları içerir. Örn: unistd.h
  • Tabii ki UTF-8 desteği ile dizin G / Ç, sembolik bağlantı yönetimi vb. Gibi eksik fonksiyonlar ekler :-).

GitHub'daki MsvcLibX README'de daha fazla ayrıntı kitaplığın nasıl oluşturulacağı ve kendi programlarınızda nasıl kullanılacağı da dahil olmak üzere .

Serbest bırakma bölümü GitHub'dan yukarıda depoda yeteneklerini gösterecektir bu MsvcLibX kütüphaneyi kullanan çeşitli programlar sunar. Örnek: PATH içinde ASCII olmayan adlara sahip dizinlerle hangi.exe aracımı deneyin, ASCII olmayan adlara sahip programları arayın ve kod sayfalarını değiştirin.

Başka bir yararlı araç conv.exe programıdır. Bu program, bir veri akışını herhangi bir kod sayfasından diğerine kolayca dönüştürebilir. Varsayılan değeri Windows kod sayfasına girilir ve geçerli konsol kod sayfasına çıkar. Bu, Windows GUI uygulamaları (örn: Not Defteri) tarafından oluşturulan verilerin bir komut konsolunda aşağıdaki gibi basit bir komutla doğru bir şekilde görüntülenmesini sağlar:type WINFILE.txt | conv

Bu MsvcLibX kütüphanesi hiçbir şekilde eksiksiz değildir ve onu geliştirmek için katkılar kabul edilir!


2

Java'da dosyayı yazmak için "IBM850" kodlamasını kullandım. Bu sorunu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.