Tôi nhận thấy rằng có hai biên dịch cờ trong trình biên dịch Visual Studio (cho C++) được gọi là MBCS và UNICODE. sự khác biệt giữa chúng là gì?
Nhiều chức năng trong Windows API có hai phiên bản: Một là mất char
thông số (trong một trang mã miền địa phương cụ thể) và một trong đó có wchar_t
tham số (trong UTF-16).
int MessageBoxA(HWND hWnd, const char* lpText, const char* lpCaption, unsigned int uType);
int MessageBoxW(HWND hWnd, const wchar_t* lpText, const wchar_t* lpCaption, unsigned int uType);
Mỗi cặp chức năng này cũng có macro không có hậu tố phụ thuộc vào việc macro UNICODE
có được xác định hay không.
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
Để thực hiện công việc này, loại TCHAR
được định nghĩa để loại bỏ loại ký tự được sử dụng bởi các chức năng API.
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Điều này, tuy nhiên, was a bad idea. Bạn phải luôn xác định rõ ràng loại ký tự.
Điều tôi không nhận được là UTF-8 là khác biệt về mặt khái niệm từ mã hóa MBCS như thế nào?
MBCS là viết tắt của "bộ ký tự nhiều byte". Đối với các đầu óc, có vẻ như UTF-8 sẽ đủ điều kiện.
Nhưng trong Windows, "MBCS" chỉ đề cập đến mã hóa ký tự có thể được sử dụng với phiên bản "A" của các hàm API của Windows. Điều này bao gồm các trang mã 932 (Shift_JIS), 936 (GBK), 949 (KS_C_5601-1987) và 950 (Big5), nhưng NOT UTF-8.
Để sử dụng UTF-8, bạn phải chuyển đổi chuỗi thành UTF-16 bằng cách sử dụng MultiByteToWideChar
, gọi phiên bản "W" của hàm và gọi WideCharToMultiByte
trên đầu ra. Đây là cơ bản những gì "A" chức năng thực sự làm, mà làm cho tôi tự hỏi why Windows doesn't just support UTF-8.
Không có khả năng hỗ trợ the most common character encoding làm cho phiên bản "A" của Windows API vô ích. Do đó, bạn nên luôn sử dụng chức năng "W".
Unicode là một nhân vật mã hóa 16-bit
này phủ nhận bất cứ điều gì tôi đọc về Unicode.
MSDN sai. Unicode là một bộ ký tự mã hóa 21 bit có nhiều mã hóa, phổ biến nhất là UTF-8, UTF-16 và UTF-32. (Có các mã hóa Unicode khác, chẳng hạn như GB18030, UTF-7 và UTF-EBCDIC.)
Bất cứ khi nào Microsoft đề cập đến "Unicode", chúng thực sự có nghĩa là UTF-16 (hoặc UCS-2). Đây là lý do lịch sử. Windows NT là người dùng đầu tiên của Unicode, ngược lại khi 16 bit được cho là đủ cho mọi người, và UTF-8 chỉ được sử dụng trên Kế hoạch 9. Vì vậy, UCS-2 là Unicode.
Cảm ơn thông tin rất hữu ích. – Naveen
"Điều này là dành cho lịch sử" Tôi tự hỏi tại sao họ không sửa tài liệu của họ trong 15 năm trước. – ybungalobill
Họ là Microsoft. Lịch sử là sai. Kháng chiến là vô ích. – tripleee