gpt4 book ai didi

windows - Windows 上 MBCS 和 UTF-8 的区别

转载 作者:可可西里 更新时间:2023-11-01 11:55:37 27 4
gpt4 key购买 nike

我正在阅读 Windows 上的字符集和编码。我注意到在 Visual Studio 编译器(用于 C++)中有两个编译器标志,称为 MBCS 和 UNICODE。它们之间有什么区别?我没有得到的是 UTF-8 在概念上与 MBCS 编码有何不同?另外,我在 MSDN 中找到了以下引述:

Unicode is a 16-bit character encoding

这否定了我读到的关于 Unicode 的一切。我认为unicode可以用不同的编码编码,例如UTF-8和UTF-16。有人可以进一步阐明这种困惑吗?

最佳答案

I noticed that there are two compilerflags in Visual Studio compiler (forC++) called MBCS and UNICODE. What isthe difference between them ?

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

然而,这 was a bad idea .您应该始终明确指定字符类型。

What I am not getting is how UTF-8 isconceptually different from a MBCSencoding ?

MBCS 代表“多字节字符集”。对于字面意思,UTF-8 似乎符合条件。

但在 Windows 中,“MBCS”仅指可与 Windows API 函数的“A”版本一起使用的字符编码。这包括代码页 932 (Shift_JIS)、936 (GBK)、949 (KS_C_5601-1987) 和 950 (Big5),不是 UTF-8。

要使用 UTF-8,您必须使用 MultiByteToWideChar 将字符串转换为 UTF-16,调用函数的“W”版本,然后调用 WideCharToMultiByte在输出上。这本质上就是“A”函数的实际作用,这让我想知道 why Windows doesn't just support UTF-8 .

无法支持 the most common character encoding使 Windows API 的“A”版本无用。因此,您应该始终使用“W”函数

更新:自 Windows 10 build 1903(2019 年 5 月更新)起,UTF-8 is now supported as an "ANSI" code page.因此,我最初(2010 年)建议始终使用“W”函数不再适用,除非您需要支持旧版本的 Windows。参见 UTF-8 Everywhere获取文本处理建议。

Unicode is a 16-bit character encoding

This negates whatever I read about theUnicode.

MSDN 是错误的。 Unicode 是一个 21 位编码的字符集,有多种编码,最常见的是 UTF-8、UTF-16 和 UTF-32。 (还有其他 Unicode 编码,例如 GB18030、UTF-7 和 UTF-EBCDIC。)

每当 Microsoft 提及“Unicode”时,它们实际上指的是 UTF-16(或 UCS-2)。这是出于历史原因。 Windows NT 是 Unicode 的早期采用者,当时 16 位被认为对每个人都足够了,而 UTF-8 仅在 Plan 9 上使用。因此 UCS-2 Unicode。

关于windows - Windows 上 MBCS 和 UTF-8 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3298569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com