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