我有一个问题:
有些库使用WCHAR作为文本参数,而其他库使用CHAR(作为UTF-8):当我编写自己的库时,我需要知道何时使用WCHAR或CHAR。
答案 0 :(得分:18)
使用char
并将其视为UTF-8。造成这种情况的原因很多;这个网站比我更好地总结了它:
建议您在从任何库中收到后立即从wchar_t
转换为char
(UTF-16到UTF-8),并在需要将字符串传递给它时转换回来。因此,要回答您的问题,请始终使用char
,除非API要求您传递或接收wchar_t
。
答案 1 :(得分:3)
WCHAR
(或Visual C ++编译器上的wchar_t
)用于 Unicode UTF-16 字符串。
这是Win32 API使用的“本机”字符串编码。
CHAR
(或char
)可用于其他几种字符串格式:ANSI,MBCS,UTF-8。
由于UTF-16是Win32 API的原生编码,因此您可能希望使用WCHAR
(更好的是基于它的正确字符串类,如std::wstring
)在Win32 API边界,在你的应用程序内。
您可以使用UTF-8(CHAR
/ char
和std::string
)在应用程序边界之外交换Unicode文本。例如:UTF-8在Internet上被广泛使用,当您在不同平台之间交换UTF-8文本时,您没有字节序问题(而不是UTF-16,您必须同时考虑UTF-16BE big-endian 和UTF-16LE little-endian 案例。)
您可以使用WideCharToMultiByte()
和MultiByteToWideChar()
Win32 API在UTF-16和UTF-8之间进行转换。这些是纯C API,它们可以方便地用C ++代码包装,使用字符串类而不是原始字符指针,而不是原始错误代码。您可以找到here的示例。
答案 2 :(得分:3)
正确的问题不是使用哪种类型,而是您与图书馆用户的合同应该是什么。 char和wchar_t都可能意味着不止一件事。
对我来说,正确的答案是使用char并考虑utf-8编码的所有内容,如utf8everywhere.org所示。这也将使编写跨平台库变得更容易。
确保正确使用字符串。像fopen()这样的一些API会接受一个char *字符串,并在Windows上编译时以不同的方式对待它(而不是UTF-8)。如果Unicode对您很重要(可能是,当您处理字符串时),请务必正确处理字符串。在boost :: locale中可以看到一个很好的例子。我还建议在Windows上使用boost :: nowide来在库中正确处理字符串。
答案 3 :(得分:1)
在Windows中,我们坚持使用WCHARS。的std :: wstring的。主要是因为如果你不是因为调用Windows函数而最终不得不进行转换。
我有一种感觉,只是因为http://utf8everywhere.org/而试图在内部使用utf8会让我们陷入困境中。[/ p>
答案 4 :(得分:0)
最好建议在开发Windows应用程序时使用TCHAR。关于TCHAR的好处是它们可以是常规字符或wchars,这取决于是否设置了unicode设置。一旦你求助于TCHAR,你确保你使用的所有字符串操作也以_t前缀开头(例如_tcslen表示字符串的长度)。这样您就会知道您的代码在Unicode和ASCII环境中都能正常工作。