19

WideCharToMultiByte() 和 wcstombs() 有什么区别 什么时候用哪一个?

4

5 回答 5

23

简而言之:该WideCharToMultiByte函数在参数列表中公开了用于转换的编码/代码页,而wcstombs没有。这是一个主要的 PITA,因为该标准没有定义用于生成wchar_t.

除此之外,WideCharToMultiByte当然是 Windows API 功能,在任何其他平台上都不可用。

WideCharToMultiByte因此,如果您的应用程序不是专门为可移植到非 Windows 操作系统而编写的,我建议您不假思索地使用。否则,您可能想与wcstombs或(最好是恕我直言)研究使用功能齐全的可移植 Unicode 库,例如ICU

于 2011-04-11T11:56:45.693 回答
13
  • 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 <-> 多字节转换。

于 2011-04-11T14:16:18.137 回答
3

与任何其他功能一样:使用在您的程序中执行您需要的功能。

WideCharToMultiByte从 UTF-16(用作 Win32 WCHAR 表示)转换为您选择的 Win32 代码页。

wcstombs从实现定义的内部wchar_t表示转换为当前实现定义的内部多字节表示。

因此,如果您的程序是使用大量使用和返回 WCHAR 字符串的 WIN32 API 函数的本机 Win32 程序,那么您需要WideCharToMultiByte. 如果您编写一些基于标准库(不是 Win32 API)的函数,这些函数与标准 C wchar_t 字符串一起使用,那么您需要wcstombs.

于 2011-04-11T14:16:09.617 回答
2

主要区别在于这wcstombs是一个标准函数,因此如果代码需要在 Windows 以外的任何平台上运行,请使用它。

于 2011-04-11T11:52:58.503 回答
2

wcstombs()是可移植的,而WideCharToMultiByte()功能只是win32。

归根结底,wcstombs()调用一个特定于系统的函数,在 Win32 上很可能是直接调用WideCharToMultiByte()- 然而,它可能会完全绕过这个函数,直接进入内部。
无论如何,没有实际的区别。

于 2011-04-11T11:53:41.403 回答