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

时间:2018-03-27 14:17:52

标签: c++ winapi visual-c++ unicode

我知道通常你不需要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字符集进行编译并使用所有宽字符方法,或者我是否应该使用{{进行编译1}}字符集并使用所有ASCII方法。

1 个答案:

答案 0 :(得分:6)

  

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

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

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

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