2009-08-11 33 views
228

Khi tôi mở cmd.exe trong Windows, mã hóa nào đang sử dụng?Trang mã hóa/mã nào là cmd.exe sử dụng?

Tôi làm cách nào để kiểm tra xem mã hóa hiện đang sử dụng? Liệu nó phụ thuộc vào thiết lập khu vực của tôi hoặc có bất kỳ biến môi trường nào để kiểm tra?

Điều gì sẽ xảy ra khi bạn nhập tệp bằng một mã hóa nhất định? Đôi khi tôi nhận được các ký tự bị cắt xén (sử dụng mã hóa không chính xác) và đôi khi nó hoạt động. Tuy nhiên tôi không tin tưởng bất cứ điều gì miễn là tôi không biết những gì đang xảy ra. Bất cứ ai có thể giải thích?

Trả lời

318

Có, nó bực bội — đôi khi type và các chương trình khác in vô nghĩa và đôi khi không.

Trước hết, các ký tự Unicode sẽ chỉ hiển thị if the current console font contains the characters. Vì vậy, hãy sử dụng phông chữ TrueType như Bảng điều khiển Lucida thay vì Phông chữ Raster mặc định.

Nhưng nếu phông chữ bảng điều khiển không chứa ký tự bạn đang cố gắng hiển thị, bạn sẽ thấy dấu chấm hỏi thay vì vô nghĩa. Khi bạn nhận được vô nghĩa, sẽ có nhiều điều xảy ra hơn là cài đặt phông chữ.

Khi các chương trình sử dụng các chức năng tiêu chuẩn C-thư viện I/O như printf, mã hóa đầu ra chương trình của phải phù hợp với mã hóa đầu ra của giao diện điều khiển, hoặc bạn sẽ nhận được vô nghia. chcp hiển thị và đặt mã hiện tại. Tất cả các đầu ra sử dụng các hàm I/O C-library chuẩn được xử lý như thể nó nằm trong mã trang được hiển thị bởi chcp.

Matching mã hóa đầu ra của chương trình với mã hóa đầu ra của giao diện điều khiển thể được thực hiện theo hai cách khác nhau:

  • Một chương trình có thể nhận được bảng mã hiện tại của giao diện điều khiển sử dụng chcp hoặc GetConsoleOutputCP, và cấu hình riêng của mình để đầu ra trong mã hóa đó hoặc

  • Bạn hoặc chương trình có thể đặt bảng mã hiện tại của bảng điều khiển bằng cách sử dụng chcp hoặc SetConsoleOutputCP để khớp mã hóa đầu ra mặc định của chương trình.

Tuy nhiên, các chương trình sử dụng các API Win32 có thể viết UTF-16LE chuỗi trực tiếp ra cửa sổ Console với WriteConsoleW. Đây là cách duy nhất để có được kết quả đầu ra chính xác mà không cần cài đặt các bản mã. Và ngay cả khi sử dụng chức năng đó, nếu chuỗi không nằm trong mã hóa UTF-16LE để bắt đầu, chương trình Win32 phải chuyển đúng trang mã tới MultiByteToWideChar. Ngoài ra, WriteConsoleW sẽ không hoạt động nếu đầu ra của chương trình được chuyển hướng; Cần có thêm không quan trọng trong trường hợp đó.

type làm việc một số thời gian vì nó sẽ kiểm tra sự bắt đầu của mỗi tập tin cho UTF-16LE Byte Order Mark (BOM), ví dụ: các byte 0xFF 0xFE. Nếu nó tìm thấy một dấu hiệu như vậy , nó sẽ hiển thị các ký tự Unicode trong tệp bằng cách sử dụng WriteConsoleW bất kể mã hiện tại. Nhưng khi type nhập bất kỳ tệp nào không có UTF-16LE BOM hoặc để sử dụng các ký tự không phải ASCII với bất kỳ lệnh nào không gọi WriteConsoleW —bạn sẽ cần đặt mã bảng điều khiển và mã hóa chương trình.


Làm cách nào chúng tôi có thể tìm ra điều này?

Đây là một tập tin thử nghiệm có chứa các ký tự Unicode:

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

Dưới đây là một chương trình Java để in ra các tập tin thử nghiệm trong một loạt các khác nhau bảng mã Unicode. Nó có thể bằng bất kỳ ngôn ngữ lập trình nào; nó chỉ in ký tự ASCII hoặc byte được mã hóa thành 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(); 
      } 
     } 
    } 
} 

Đầu ra trong bảng mã mặc định? Tổng lượng rác!

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} 

Tuy nhiên, những gì nếu chúng ta type các tập tin đã lưu? Chúng chứa chính xác cùng một byte đã được in trên bảng điều khiển.

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

Các chỉ điều mà các công trình là tập tin UTF-16LE, với một BOM, in đến console qua type.

Nếu chúng ta sử dụng bất cứ điều gì khác hơn là type để in các tập tin, chúng tôi nhận rác:

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. 

Từ thực tế là copy CON không hiển thị Unicode một cách chính xác, chúng ta có thể kết luận rằng lệnh type có logic để phát hiện một UTF-16LE BOM tại số bắt đầu của tệp và sử dụng các API Windows đặc biệt để in.

Chúng ta có thể thấy điều này bằng cách mở cmd.exe trong một trình gỡ lỗi khi nó đi vào type ra một tập tin:

enter image description here

Sau type mở một tập tin, nó sẽ kiểm tra cho một BOM của 0xFEFF -ie, các byte 0xFF 0xFE ở cấp độ nhỏ — và nếu có BOM như vậy, type đặt cờ nội bộ fOutputUnicode. Cờ này được chọn sau để quyết định có nên gọi số WriteConsoleW hay không.

Nhưng đó là cách duy nhất để có được type để xuất Unicode và chỉ cho các tệp có BOM và ở dạng UTF-16LE. Đối với tất cả các tệp khác và đối với các chương trình không có mã đặc biệt để xử lý đầu ra của bảng điều khiển, tệp của bạn sẽ là được diễn giải theo trang mã hiện tại và có thể hiển thị là ngữ pháp.

Bạn có thể bắt chước cách type đầu ra Unicode để giao diện điều khiển trong các chương trình của riêng bạn như vậy:

#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; 
} 

chương trình này hoạt động để in Unicode trên Windows giao diện điều khiển bằng cách sử dụng bảng mã mặc định.


Đối với chương trình Java mẫu, chúng ta có thể có được một chút đầu ra chính xác bằng cách thiết lập các bảng mã bằng tay, mặc dù sản lượng được điều sai lầm trong cách kỳ lạ:

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 
… 

Tuy nhiên, một C chương trình mà bộ một Unicode UTF-8 bảng mã:

#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; 
} 

không có đầu ra chính xác:

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

Tinh thần của câu chuyện?

  • type có thể in file UTF-16LE với BOM không phụ thuộc bảng mã hiện tại của bạn
  • chương trình
  • Win32 có thể được lập trình để đầu ra Unicode để giao diện điều khiển, sử dụng WriteConsoleW.
  • Các chương trình khác mà thiết lập các bảng mã và điều chỉnh mã hóa đầu ra cho phù hợp có thể in Unicode trên giao diện điều khiển bất kể những gì các bảng mã là khi chương trình bắt đầu
  • Đối với mọi thứ khác bạn sẽ phải mess xung quanh với chcp, và có thể sẽ vẫn có đầu ra lạ.
+48

Whoa, đây phải là câu trả lời chi tiết nhất mà tôi từng thấy trên SO. Thêm tín dụng cho các bản in dissasembly và skillz đa ngôn ngữ! Chỉ đẹp thôi, thưa ngài! –

+2

Người ta cũng có thể muốn nghiên cứu phần mở rộng cụ thể của Microsoft _setmode (_fileno (stdout), _O_U16TEXT) được giới thiệu trong VS2008. Xem http://stackoverflow.com/a/9051543 và http://stackoverflow.com/a/12015918 và http://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs. 90) .aspx Bên cạnh sự khác biệt về tính di động rõ ràng giữa _setmode() và SetConsoleOutputCP(), cũng có thể có các sự tinh tế và tác dụng phụ khác ẩn trong cả hai cách tiếp cận không được hiểu rõ ngay từ cái nhìn đầu tiên. Nếu andrewdotn có thể cập nhật câu trả lời của mình với bất kỳ quan sát nào về _setmode (fd, _O_U16TEXT), điều đó thật tuyệt. – JasDev

+9

Trong khi đây là một câu trả lời tuyệt vời, nó gây hiểu lầm khi nói rằng giao diện điều khiển hỗ trợ UTF-16. Nó được giới hạn trong UCS-2, tức là giới hạn đối với các ký tự trong mặt phẳng đa ngôn ngữ cơ bản (BMP). Khi máy chủ bàn điều khiển Win32 (conhost.exe, ngày nay) được thiết kế vào khoảng năm 1990, Unicode là chuẩn 16 bit, do đó bộ đệm màn hình bàn điều khiển sử dụng một WCHAR 16 bit cho mỗi ô ký tự. Cặp thay thế UTF-16 in dưới dạng hai ký tự hộp. – eryksun

20

Để trả lời truy vấn thứ hai của bạn. cách mã hóa hoạt động, Joel Spolsky đã viết một số lớn introductory article on this. Khuyến khích mạnh mẽ.

+12

Tôi đã đọc và tôi biết điều đó.Tuy nhiên, trên Windows tôi luôn cảm thấy bị mất vì hệ điều hành và hầu hết các ứng dụng dường như hoàn toàn không biết gì về mã hóa. – danglund

5

Lệnh CHCP hiển thị trang mã hiện tại. Nó có ba chữ số: 8xx và khác với Windows 12xx. Vì vậy, gõ một văn bản chỉ có tiếng Anh, bạn sẽ không thấy bất kỳ sự khác biệt nào, nhưng một trang mã mở rộng (như Cyrillic) sẽ được in sai.

+5

CHCP không chỉ hiển thị 3 chữ số cũng như ở định dạng 8 ##. 437 là ví dụ mã hóa của Hoa Kỳ, và nó là tiêu chuẩn defacto trên các hệ thống tiếng Anh. - 65001 là một bảng mã Unicode (Nếu tôi nhớ lại nó đúng là UTF-8 và 65000 là UTF-7) và có thể được chọn. Ngoài ra CMD cho phép chuyển sang trang 1250 mã ví dụ, nhưng tôi không biết kể từ khi các trang mã này được lựa chọn. (Theo Win7.) –

21

Loại

chcp 

để xem trang mã hiện tại của bạn (như Dewfy đã nói).

Sử dụng

nlsinfo 

để xem tất cả các trang mã cài đặt và tìm hiểu những gì số trang mã của bạn nghĩa là gì.

Bạn cần cài đặt bộ tài nguyên Windows Server 2003 (hoạt động trên Windows   XP) để sử dụng nlsinfo.

+14

Điều thú vị là 'nlsinfo' không xuất hiện trên Windows 7. – Joey

+2

' nlsinfo' cũng không tồn tại trên máy Windows XP SP3 của tôi. –

+2

Ồ, tôi xin lỗi. Tôi nghĩ rằng nó đi kèm với các công cụ Windows Server Resource Kit. Tôi đã sử dụng nó một vài lần trên máy Windows XP SP3 của tôi trước đó và không biết nó đã không được cài đặt theo mặc định. –

1

Tôi đã thất vọng lâu bởi các vấn đề về trang mã Windows và các vấn đề về tính di động và bản địa hóa của chương trình C mà chúng gây ra. Các bài viết trước đã nêu chi tiết các vấn đề về độ dài, vì vậy tôi sẽ không thêm bất cứ điều gì về khía cạnh này.

Để tạo một câu chuyện dài ngắn, cuối cùng tôi đã kết thúc lớp thư viện tương thích UTF-8 của riêng mình trên thư viện C chuẩn C++. Về cơ bản thư viện này đảm bảo rằng một chương trình C chuẩn hoạt động đúng, trong bất kỳ trang mã nào, sử dụng UTF-8 nội bộ.

Thư viện này, được gọi là MsvcLibX, có sẵn dưới dạng nguồn mở tại https://github.com/JFLarvoire/SysToolsLib. Các tính năng chính:

  • Nguồn C được mã hóa bằng UTF-8, sử dụng chuỗi char [] C bình thường và API thư viện chuẩn C.
  • Trong bất kỳ trang mã nào, mọi thứ được xử lý nội bộ dưới dạng UTF-8 trong mã của bạn, bao gồm hàm main() argv [], với đầu vào và đầu ra chuẩn được tự động chuyển sang trang mã đúng.
  • Tất cả các chức năng tệp stdio.h đều hỗ trợ tên đường dẫn UTF-8> 260 ký tự, thực tế lên đến 64 KByte. Các nguồn giống nhau có thể biên dịch và liên kết thành công trong Windows bằng cách sử dụng thư viện Visual C++ và MsvcLibX và Visual C++ C, và trong Linux sử dụng thư viện C và Linux chuẩn C, không cần #ifdef ... #endif blocks.
  • Thêm bao gồm các tệp phổ biến trong Linux, nhưng bị thiếu trong Visual C++. Ví dụ: unistd.h
  • Thêm các chức năng bị thiếu, như các chức năng cho thư mục I/O, quản lý liên kết tượng trưng, ​​v.v., tất cả đều hỗ trợ UTF-8 tất nhiên :-).

Chi tiết khác trong MsvcLibX README on GitHub, bao gồm cách xây dựng thư viện và sử dụng nó trong chương trình của riêng bạn.

release section trong kho lưu trữ GitHub ở trên cung cấp một số chương trình sử dụng thư viện MsvcLibX này, sẽ hiển thị các khả năng của nó. Ví dụ: Hãy thử công cụ which.exe của tôi với các thư mục có tên không phải ASCII trong PATH, tìm kiếm các chương trình có tên không phải ASCII và thay đổi các trang mã.

Một công cụ hữu ích khác có chương trình conv.exe. Chương trình này có thể dễ dàng chuyển đổi luồng dữ liệu từ bất kỳ trang mã nào sang bất kỳ trang nào khác. Mặc định của nó là đầu vào trong trang mã Windows và đầu ra trong trang mã giao diện điều khiển hiện tại. Điều này cho phép xem chính xác dữ liệu được tạo bởi các ứng dụng Windows GUI (ví dụ: Notepad) trong bảng điều khiển lệnh, với một lệnh đơn giản như: type WINFILE.txt | conv

Thư viện MsvcLibX này hoàn toàn không có nghĩa và đóng góp để cải thiện nó!

Các vấn đề liên quan