WideCharToMultiByte()与wcstombs()

Gre*_*orn 16 c++ unicode winapi wchar widechar

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

Jon*_*Jon 21

简而言之:该WideCharToMultiByte函数在参数列表中公开用于转换的编码/代码页,而wcstombs不是.这是一个主要的PITA,因为标准没有定义用于生成的编码wchar_t,而作为开发人员当然需要知道要转换为/来自哪种编码.

除此之外WideCharToMultiByte,当然是Windows API函数,并且在任何其他平台上都不可用.

因此,WideCharToMultiByte如果您的应用程序没有专门编写为可移植到非Windows操作系统,我建议您毫不犹豫地使用.否则,您可能想要与wcstombs(或最好是恕我直言)一起使用全功能便携式Unicode库(如ICU).

  • <<没有人(包括那个实体)知道什么是"实现定义"的意思>>这不是真的.术语"实现定义"与"未定义"不同."实施定义"意味着通过实施明确定义和记录. (3认同)
  • “标准没有定义用于生成wchar_t的编码,而作为开发人员,您当然需要知道您要向/从转换为哪种编码。” 这取决于你所追求的。“ WideCharToMultiByte”从UTF-16转换为您选择的Win32代码页。wcstombs从实现定义的内部wchar_t表示转换为当前实现定义的内部多字节表示。开发人员不必知道实现定义的编码。 (2认同)

Chr*_*cke 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 < - >多字节转换.

  • 这个问题已经有了一个选定的答案,我只是想有人应该提一下(鉴于这个问题被标记为c ++,而不是c)c ++确实也有解决方案. (2认同)