在C++中何时使用WCHAR以及何时使用CHAR

use*_*256 13 c++ unicode

我有个问题:

有些库使用WCHAR作为文本参数,而其他库使用CHAR(作为UTF-8):当我编写自己的库时,我需要知道何时使用WCHAR或CHAR.

Ben*_*ers 19

使用char并将其视为UTF-8.造成这种情况的原因很多; 这个网站比我能更好地总结它:

http://utf8everywhere.org/

它建议您在从任何库中收到它后立即转换wchar_tchar(UTF-16到UTF-8),并在需要将字符串传递给它时转换回来.因此,要回答您的问题,请始终使用,char除非API要求您传递或接收wchar_t.

  • 实际上,它说使用UTF-8"如果应用程序不应该专注于文本".我倾向于在任何地方使用UTF-8,但我不确定它在编辑器中是否合适,例如.例如,如果使用UTF-8,正则表达式之类的东西会明显变慢. (4认同)

Mr.*_*C64 7

WCHAR(或wchar_t在 Visual C++ 编译器上)用于Unicode UTF-16字符串。
这是 Win32 API 使用的“本机”字符串编码。

CHAR(或char) 可用于其他几种字符串格式:ANSI、MBCS、UTF-8。

由于 UTF-16 是Win32 API的本机编码,因此您可能希望在应用程序内的 Win32 API 边界处使用WCHAR(以及更好的基于它的适当字符串类,例如std::wstring)。

并且您可以使用 UTF-8(so、CHAR/charstd::string)在您的应用程序边界之外交换您的 Unicode 文本。例如:UTF-8 在互联网上被广泛使用,当你在不同平台之间交换 UTF-8 文本时你不存在字节序的问题(而不是 UTF-16 你必须同时考虑 UTF-16BE大- endian和 UTF-16LE little-endian情况)。

您可以使用WideCharToMultiByte()MultiByteToWideChar()Win32 API在 UTF-16 和 UTF-8 之间进行转换。这些是纯 C API,可以方便地包装在 C++ 代码中,使用字符串类代替原始字符指针,使用异常代替原始错误代码。你可以在这里找到一个例子。

  • @BrunoFerreira 实际上`wchar_t` 不一定比`char` 宽。唯一的要求是 `wchar_t` 足够大,以便为实现支持的最大字符集的每个成员存储一个唯一值。因此,如果实现的最大字符集小于 256,则 `wchar_t` 可以是 8 位。 (2认同)