WideCharToMultiByte()与wcstombs()

时间:2011-04-11 11:51:15

标签: c++ winapi unicode widechar wchar

WideCharToMultiByte()和wcstombs()之间的区别是什么 何时使用哪一个?

5 个答案:

答案 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()的直接调用 - 但是,它可能完全绕过这个函数而只是去直接进入内部。
无论如何,没有实际的区别。