2009-05-26 30 views
7

Tôi phải chuyển đổi mã hóa đầu ra chuỗi của ứng dụng VB6 thành mã hóa cụ thể.Làm cách nào tôi có thể lập trình xác định mã trang mặc định hiện tại của Windows?

Vấn đề là, tôi không biết mã hóa của chuỗi, vì lý do đó:

Theo tài liệu VB6 khi truy cập vào các chức năng API nhất định các chuỗi Unicode nội bộ được chuyển đổi thành chuỗi ANSI sử dụng mã hóa mặc định của Windows.

Do đó, mã hóa đầu ra chuỗi có thể khác nhau trên các hệ thống khác nhau, nhưng tôi phải biết nó để thực hiện chuyển đổi.

Làm cách nào tôi có thể đọc bảng mã mặc định bằng API Win32 hoặc - nếu không có cách nào khác - bằng cách đọc sổ đăng ký?

Trả lời

14

Nó có thể còn gọn gàng hơn bằng cách sử dụng GetACP - cuộc gọi API Win32 để trả về trang mã mặc định! (Trang mặc định đang thường được gọi là "ANSI")

int nCodePage = GetACP(); 

Cũng có nhiều cuộc gọi API (như MultiByteToWideChar) chấp nhận các giá trị không đổi CP_ACP (zero) mà luôn luôn means "use the system code page". Vì vậy, bạn có thể không thực sự cần phải biết trang mã hiện tại, tùy thuộc vào những gì bạn muốn làm với nó.

+0

Nhờ bất kỳ ai đề xuất chỉnh sửa đề cập đến "ANSI" và cải thiện định dạng mã một chút. Ý tưởng hay, tôi đã tự chỉnh sửa nó. – MarkJ

+1

Việc sử dụng ANSI này khá vô nghĩa. Các trang mã Windows thường được gọi là các trang mã ANSI, vì chúng được dự định trở thành tiêu chuẩn; họ không bao giờ làm. Sử dụng sau đó 'ANSI' để chỉ tham chiếu đến mặc định là rất khó hiểu và tôi đã không bao giờ nhìn thấy nó được sử dụng như thế này. – MicroVirus

1

GetSystemDefaultLCID() cung cấp cho bạn ngôn ngữ hệ thống.

Nếu LCID là không đủ và bạn thực sự cần các bảng mã, sử dụng mã này:

TCHAR szCodePage[10]; 
    int cch= GetLocaleInfo(
    GetSystemDefaultLCID(), // or any LCID you may be interested in 
    LOCALE_IDEFAULTANSICODEPAGE, 
    szCodePage, 
    countof(szCodePage)); 

    nCodePage= cch>0 ? _ttoi(szCodePage) : 0; 
+0

Hoặc ngắn gọn hơn, như trong câu trả lời của tôi: 'int nCodePage = GetACP();' :) Nó khá dài để lấy tên của trang mã và sau đó lấy trang mã dưới dạng chuỗi và sau đó chuyển đổi thành số nguyên – MarkJ

+0

Thật vậy _more ngắn gọn_ :-D –

0

Đó làm việc cho tôi, cảm ơn, nhưng có thể được viết ngắn gọn hơn như:

UINT nCodePage = CP_ACP; 
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, 
    LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE, 
    (LPTSTR)&nCodePage, sizeof(nCodePage)/sizeof(_TCHAR)); 
+0

Hoặc thậm chí ngắn gọn hơn, như trong câu trả lời của tôi: 'int nCodePage = GetACP();' :) Đó là một chút dài gió để có được * tên * của trang mã và sau đó tìm kiếm mã số nhận dạng từ tên – MarkJ

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