在C++中,何时使用WCHAR以及何时使用CHAR
In C++ when to use WCHAR and when to use CHAR
我有一个问题:
一些库使用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
/char
和std::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环境中工作。
- 何时使函数成为类成员函数C++?
- 何时必须使操作员<<过载?
- 我如何使我的循环转到char*阵列的尽头,并将每个城市都放在链接的列表中(城市被划分为白色的空间)
- 如何添加 char 数组(并使它们变为整数)
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 使strncmp()接受无符号的char *作为论点
- 计数最低号码.char.从两个字符串中删除以使它们成为字眼
- 将字符串转换为char,当我cout时,它是正确的,但是当我将chdir与char一起使用时,它不起作用
- 使数组(char)1在stdio.h上给出错误
- PC何时在if块内部分配静态char*
- C 使char数组具有字符串的值
- 如何使const char*函数起作用
- 如果您使一个char*ptr存储整数变量的地址,会发生什么
- 为什么这段代码不会使 cin 崩溃?char 输入了一个整数变量 C++
- 如何使C++函数返回 char 数组所有排列的向量
- 何时使用 std::string vs char*
- 使C++将无符号的char*视为char*
- 使对unsigned char的访问线程安全(原子)
- Apple C++ LLVM Compiler 4.x & UNICODE:何时需要?UNICODE 是默认编译器字符集吗?使代码同时编译 ANSI 和 UNICODE 版本
- 在C++中,何时使用WCHAR以及何时使用CHAR