WideCharToMultiByte() 与 wcstombs()

发布于 2024-10-31 07:27:27 字数 58 浏览 0 评论 0 原文

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

What is the difference between WideCharToMultiByte() and wcstombs()
When to use which one?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

凝望流年 2024-11-07 07:27:27

简而言之: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, while wcstombs does not. This is a major PITA, as the standard does not define what encoding is to be used to produce the wchar_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 with wcstombs or (preferably IMHO) look into using a full-feature portable Unicode library such as ICU.

醉生梦死 2024-11-07 07:27:27
  • 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.

梦里南柯 2024-11-07 07:27:27

与任何其他函数一样:使用在程序中执行您所需操作的函数。

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 internal wchar_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 need wcstombs.

油焖大侠 2024-11-07 07:27:27

主要区别在于 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.

一笔一画续写前缘 2024-11-07 07:27:27

wcstombs() 是可移植的,而 WideCharToMultiByte() 函数仅适用于 win32。

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

wcstombs() is portable, whereas the WideCharToMultiByte() 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 to WideCharToMultiByte() - however, it might bypass this function completely and just go straight to the internals.
In any case, there's no practical difference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文