WideCharToMultiByte() 与 wcstombs()
WideCharToMultiByte() 和 wcstombs() 有什么区别 什么时候使用哪一个?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
WideCharToMultiByte() 和 wcstombs() 有什么区别 什么时候使用哪一个?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
简而言之:
WideCharToMultiByte
函数公开了参数列表中用于转换的编码/代码页,而wcstombs
则没有。这是一个主要的 PITA,因为标准没有定义使用什么编码来生成 < code>wchar_t,而作为开发人员,您当然需要知道要转换为/从什么编码。除此之外,
WideCharToMultiByte
当然是 Windows API 函数,在任何其他平台上都不可用。因此,如果您的应用程序不是专门为移植到非 Windows 操作系统而编写的,我建议您不假思索地使用
WideCharToMultiByte
。否则,您可能想尝试使用wcstombs
或(最好是恕我直言)考虑使用全功能的可移植 Unicode 库,例如 ICU。In a nutshell: the
WideCharToMultiByte
function exposes the encodings/code pages used for the conversion in the parameter list, whilewcstombs
does not. This is a major PITA, as the standard does not define what encoding is to be used to produce thewchar_t
, while you as a developer certainly need to know what encoding you are converting to/from.Apart from that,
WideCharToMultiByte
is of course a Windows API function and is not available on any other platform.Therefore I would suggest using
WideCharToMultiByte
without a moment's thought if your application is not specifically written to be portable to non-Windows OSes. Otherwise, you might want to wrestle withwcstombs
or (preferably IMHO) look into using a full-feature portable Unicode library such as 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 is a Windows API function that converts between Windows defined multibyte code pages stored in CHAR, and UTF16, stored in WCHAR. The codepage to use is passed as the first parameter, and can be passed as CP_ACP, which means a codepage specific to the systems current locale - set in the control panel Localization tool "Language to use for Non Unicode Programs". It is accessed by #including , and is available only on Windows.
wcstombs is a Standard C Runtime function that converts between the c-runtimes current char* encoding, and wchar_t* encoding. setlocale iirc can be used to set the codepage(s) to use.
std::codecvt is the C++ Standard Library template class, in , used for converting strings between various encodings using a variety of traits type mechanisims to define the source and destination encodings.
There are other libraries, including ICONV or ICU that also do various unicode <-> multibyte conversions.
与任何其他函数一样:使用在程序中执行您所需操作的函数。
WideCharToMultiByte
从 UTF-16(用作 Win32 WCHAR 表示形式)转换为您选择的 Win32 代码页。wcstombs
从实现定义的内部wchar_t
表示形式转换为当前实现定义的内部多字节表示形式。因此,如果您的程序是本机 Win32 程序,并且使用大量使用和返回 WCHAR 字符串的 WIN32 API 函数,那么您需要
WideCharToMultiByte
。如果您编写一些基于标准库(不是 Win32 API)的函数,这些函数使用标准 C wchar_t 字符串,那么您需要wcstombs
。Like with any other function: use the function that does what you need in your program.
WideCharToMultiByte
converts from UTF-16 (used as Win32 WCHAR representation) to Win32 code-page of your choice.wcstombs
converts from implementation-defined internalwchar_t
representation to current implementation-defined internal multi-byte representation.So if your program is native Win32 program that uses lots of WIN32 API functions that use and return WCHAR strings then you need
WideCharToMultiByte
. If you write some functions based on standard library (not Win32 API) that work with standard C wchar_t strings then you needwcstombs
.主要区别在于
wcstombs
是标准函数,因此如果代码需要在 Windows 以外的任何平台上运行,请使用该函数。The main difference is that
wcstombs
is a standard function, so use that if code needs to run on any platform other than Windows.wcstombs()
是可移植的,而WideCharToMultiByte()
函数仅适用于 win32。归根结底,
wcstombs()
调用系统特定的函数,在 Win32 上该函数很可能是直接调用WideCharToMultiByte()
- 但是,它可能完全绕过这个函数,直接进入内部。无论如何,没有实际区别。
wcstombs()
is portable, whereas theWideCharToMultiByte()
function is win32 only.When it comes down to it,
wcstombs()
calls a system-specific function, which on Win32 will most likely be a straight call toWideCharToMultiByte()
- however, it might bypass this function completely and just go straight to the internals.In any case, there's no practical difference.