使用 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,您必须使用宽“W”版本 的功能以及我不确定是否应该使用多字节字符集进行编译 并使用所有宽字符方法,或者如果我应该编译 unicode 字符集并使用所有 ASCII 方法。
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?的主要内容,如果未能解决你的问题,请参考以下文章