在使用WinApi时,wchar_t是否需要支持unicode?

Mic*_*ith 3 c++ unicode winapi visual-c++

我知道通常你不需要wchar_t支持unicode用于通用代码,但是,Windows API似乎有一个ASCII或宽字符等效于所有采用字符串的方法.例如:

FindWindowA(nullptr, "File Explorer");  // ASCII version
FindWindowW(nullptr, L"File Explorer"); // Wide Character version
Run Code Online (Sandbox Code Playgroud)

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

Character Set: Use Unicode Character Set
Run Code Online (Sandbox Code Playgroud)

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

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

Ani*_*kar 6

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

  • 如果要使用Unicode,则必须使用功能的宽"W"版本wchar_t.
  • 如果要使用多字节字符集(MBCS),则必须使用函数的"A"版本char.
  • 函数的"A"版本通常不支持所有Unicode字符,并且基本上使用扩展其输入参数MultiByteToWideChar(CP_ACP),调用它们的"W"对应物,最后将结果转换回多字节使用WideCharToMultiByte(CP_ACP).

因此,我建议您使用函数的"W"版本,假设您正在编写Windows NT及更高版本.

在Win32 API的上下文中,Microsoft的"Unicode"通常是指UTF-16.此外,Microsoft的MBCS本质上是DBCS,对于Windows 9x操作系统,缺少"W"版本的功能.

  • @IInspectable:Win32 API中没有任何东西使用UTF-8(使用`CP_UTF8`代码页时`MultiByteToWideChar` /`WideCharToMultiByte`除外).Windows DOES中Unicode的现代用法仅指UTF-16. (2认同)
  • @IInspectable:.NET不是Win32,元数据不是API.在Win32 API和.NET API中,Unicode字符串是UTF-16编码的,没有UTF-8编码的字符串类型. (2认同)
  • @IInspectable:问题标记为[tag:winapi],仅适用于Win32 API.WinRT由[tag:windows-runtime]标记覆盖. (2认同)
  • 我建议将该句改为_"在Win32 API的上下文中,Microsoft的"Unicode"通常是指UTF-16."_ (2认同)