使用 WinApi 时是不是需要 wchar_t 来支持 unicode?

Posted

技术标签:

【中文标题】使用 WinApi 时是不是需要 wchar_t 来支持 unicode?【英文标题】:Is wchar_t needed to support unicode when using the WinApi?使用 WinApi 时是否需要 wchar_t 来支持 unicode? 【发布时间】:2018-03-27 14:17:52 【问题描述】:

我知道通常您不需要wchar_t 来支持通用代码的 unicode,但是,Windows API 似乎具有与所有采用字符串的方法等效的 ASCII 或宽字符。例如:

FindWindowA(nullptr, "File Explorer");  // ASCII version
FindWindowW(nullptr, L"File Explorer"); // Wide Character version

我使用Visual Studio 2017 编译Properties > General 中的以下选项:

Character Set: Use Unicode Character Set

另一个可用选项是:Use Multi-Byte Character Set

我希望能够支持带有 unicode 字符的文件名,但我不确定是否应该使用 multi-byte 字符集进行编译并使用所有宽字符方法,或者是否应该使用 unicode 字符进行编译设置和使用所有的 ASCII 方法。

【问题讨论】:

使用 unicode 字符编译并始终使用宽字符方法 - ASCII 方法是外壳 旧版 Win32 API 使用 ANSI,而不是 ASCII。 【参考方案1】:

我不确定是否应该使用多字节字符集进行编译 并使用所有宽字符方法,或者如果我应该编译 unicode 字符集并使用所有 ASCII 方法。

如果要使用 Unicode,您必须使用宽“W”版本 的功能以及wchar_t。 如果要使用多字节字符集 (MBCS),则必须使用带有 char 的“A”版本函数。 函数的“A”版本通常不支持所有Unicode字符,本质上使用MultiByteToWideChar(CP_ACP)扩展其输入参数,调用它们的“W”对应物,最后使用@987654327将结果转换回多字节@。

因此,假设您正在为 Windows NT 及更高版本进行编码,我建议您使用“W”版本的函数。

在 Win32 API 的上下文中,微软的“Unicode”一般指的是 UTF-16。 此外,Microsoft 的 MBCS 本质上是 DBCS,对于 Windows 9x 操作系统,缺少“W”版本的功能。

【讨论】:

Microsoft 为 Win9x 系列产品提供了 Microsoft Layer for Unicode,以便您可以访问 API 的宽字符版本。 @IInspectable:Win32 API 中没有任何内容使用 UTF-8(使用 CP_UTF8 代码页时,MultiByteToWideChar/WideCharToMultiByte 除外)。 Windows 中 Unicode 的现代用法确实仅指 UTF-16。 @IInspectable:.NET 不是 Win32,元数据不是 API。在 Win32 API 和 .NET API 中,Unicode 字符串是 UTF-16 编码的,没有 UTF-8 编码的字符串类型。 @IInspectable:问题标记为winapi,仅适用于 Win32 API。 WinRT 被windows-runtime 标签覆盖。 我建议把那句话改成“在Win32 API的上下文中,微软的“Unicode”一般指的是UTF-16。”

以上是关于使用 WinApi 时是不是需要 wchar_t 来支持 unicode?的主要内容,如果未能解决你的问题,请参考以下文章

wchar_t 无符号或有符号

Unicode 支持需要 wchar_t 吗?

wchar_t 数据是不是需要字节序转换?

C ++:从wchar_t *转换为unsigned short *是否安全?

asprintf 有 wchar_t 版本吗?

为啥它被称为“wchar_t”而不是简单的“wchar”?