我注意到 Visual Studio 编译器(用于 C++)中有两个编译器标志,称为 MBCS 和 UNICODE。它们之间有什么区别?
Windows API 中的许多函数有两个版本:一个接受char
参数(在特定于语言环境的代码页中),另一个接受wchar_t
参数(在 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);
这些函数对中的每一个也有一个不带后缀的宏,这取决于是否UNICODE
定义了宏。
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
为了完成这项工作,TCHAR
定义类型以抽象出 API 函数使用的字符类型。
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
然而,这是个坏主意。您应该始终明确指定字符类型。
我没有得到的是 UTF-8 在概念上与 MBCS 编码有何不同?
MBCS 代表“多字节字符集”。从字面上看,UTF-8 似乎符合条件。
但在 Windows 中,“MBCS”仅指可与“A”版本的 Windows API 函数一起使用的字符编码。这包括代码页 932 (Shift_JIS)、936 (GBK)、949 (KS_C_5601-1987) 和 950 (Big5),但不包括 UTF-8。
要使用 UTF-8,您必须使用 将字符串转换为 UTF-16 MultiByteToWideChar
,调用函数的“W”版本,然后调用WideCharToMultiByte
输出。这本质上就是“A”函数实际所做的,这让我想知道为什么 Windows 不只支持 UTF-8。
由于无法支持最常见的字符编码,因此“A”版本的 Windows API 毫无用处。因此,您应该始终使用“W”功能。
Unicode 是 16 位字符编码
这否定了我读到的关于 Unicode 的任何内容。
MSDN 是错误的。Unicode 是一个 21 位编码字符集,有多种编码,最常见的是 UTF-8、UTF-16 和 UTF-32。(还有其他 Unicode 编码,例如 GB18030、UTF-7 和 UTF-EBCDIC。)
每当微软提到“Unicode”时,它们实际上是指 UTF-16(或 UCS-2)。这是出于历史原因。Windows NT 是 Unicode 的早期采用者,当时人们认为 16 位对每个人来说都足够了,而 UTF-8 仅在 Plan 9 中使用。所以 UCS-2是Unicode。