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

In C++ when to use WCHAR and when to use CHAR

本文关键字:何时使 CHAR WCHAR C++      更新时间:2023-10-16

我有一个问题:

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

使用char并将其视为UTF-8。这其中有很多原因;这个网站对它的总结比我所能做的要好得多:

http://utf8everywhere.org/

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

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

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

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

您可以使用UTF-8(因此,CHAR/charstd::string)在应用程序边界之外交换Unicode文本。例如:UTF-8在互联网上被广泛使用,当您在不同平台之间交换UTF-8文本时,您不会遇到端序问题(相反,使用UTF-16时,您必须同时考虑UTF-16BEbig-endian和UTF-16LElittle-endiancase)。

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

正确的问题不是使用哪种类型,而是您与库用户的合同应该是什么。char和wchar_t都可能意味着不止一件事。

对我来说,正确的答案是使用char并考虑utf-8编码的所有内容,正如utf8everywhere.org所建议的那样。这也将使编写跨平台库变得更加容易。

不过,请确保正确使用字符串。一些API,如fopen(),在Windows上编译时会接受char*字符串并将其区别对待(而不是UTF-8)。如果Unicode对您来说很重要(而且在处理字符串时可能很重要),请确保正确处理字符串。在boost::locale中可以看到一个很好的例子。我还建议在Windows上使用boost::nowide,以便在库中正确处理字符串。

在Windows中,我们坚持WCHARS。std::wstring。主要是因为如果你不这样做,你最终不得不转换,因为调用Windows函数。

我有一种感觉,尝试在内部使用utf8仅仅是因为http://utf8everywhere.org/会咬我们屁股的。

在开发Windows应用程序时,最好使用TCHAR。TCHAR的好处是,它们可以是常规字符,也可以是wchars,这取决于是否设置了unicode设置。一旦使用TCHAR,请确保使用的所有字符串操作也以_t前缀开头(例如,字符串长度为_tcslen)。这样,您就会知道您的代码可以在Unicode和ASCII环境中工作。