WideCharToMultiByte() 和 wcstombs() 有什么区别 什么时候用哪一个?
5 回答
简而言之:该WideCharToMultiByte
函数在参数列表中公开了用于转换的编码/代码页,而wcstombs
没有。这是一个主要的 PITA,因为该标准没有定义用于生成wchar_t
.
除此之外,WideCharToMultiByte
当然是 Windows API 功能,在任何其他平台上都不可用。
WideCharToMultiByte
因此,如果您的应用程序不是专门为可移植到非 Windows 操作系统而编写的,我建议您不假思索地使用。否则,您可能想与wcstombs
或(最好是恕我直言)研究使用功能齐全的可移植 Unicode 库,例如ICU。
WideCharToMultiByte 是一个 Windows API 函数,用于在存储在 CHAR 中的 Windows 定义的多字节代码页和存储在 WCHAR 中的 UTF16 之间进行转换。要使用的代码页作为第一个参数传递,并且可以作为 CP_ACP 传递,这意味着特定于系统当前区域设置的代码页 - 在控制面板本地化工具“用于非 Unicode 程序的语言”中设置。它由 #include 访问,并且仅在 Windows 上可用。
wcstombs 是标准 C 运行时函数,可在 c 运行时当前 char* 编码和 wchar_t* 编码之间进行转换。setlocale iirc 可用于设置要使用的代码页。
std::codecvt 是 C++ 标准库模板类,用于在各种编码之间转换字符串,使用各种特征类型机制来定义源和目标编码。
还有其他库,包括 ICONV 或 ICU,它们也进行各种 unicode <-> 多字节转换。
与任何其他功能一样:使用在您的程序中执行您需要的功能。
WideCharToMultiByte
从 UTF-16(用作 Win32 WCHAR 表示)转换为您选择的 Win32 代码页。
wcstombs
从实现定义的内部wchar_t
表示转换为当前实现定义的内部多字节表示。
因此,如果您的程序是使用大量使用和返回 WCHAR 字符串的 WIN32 API 函数的本机 Win32 程序,那么您需要WideCharToMultiByte
. 如果您编写一些基于标准库(不是 Win32 API)的函数,这些函数与标准 C wchar_t 字符串一起使用,那么您需要wcstombs
.
主要区别在于这wcstombs
是一个标准函数,因此如果代码需要在 Windows 以外的任何平台上运行,请使用它。
wcstombs()
是可移植的,而WideCharToMultiByte()
功能只是win32。
归根结底,wcstombs()
调用一个特定于系统的函数,在 Win32 上很可能是直接调用WideCharToMultiByte()
- 然而,它可能会完全绕过这个函数,直接进入内部。
无论如何,没有实际的区别。