我有一个问题:
一些库使用WCHAR作为文本参数,而另一些库使用CHAR(作为UTF-8):当我编写自己的库时,我需要知道何时使用WCHAR或CHAR。
使用char
并将其视为UTF-8。有很多原因,这个网站比我更好地总结了它:
它建议在从任何库接收到wchar_t
后尽快转换为char
(UTF-16转为UTF-8),并在需要传递字符串时进行转换。所以回答你的问题,除了在API要求你传递或接收wchar_t
的时候外,始终使用char
。
U+10000-U+10FFFF
,UTF-8表示需要4个字节来编码一个代码点。当你说把char
作为UTF-8处理时,我不知道它的意思。char
怎么能存储UTF-8编码呢? - overexchangechar
数组而不是单个char
- 我只是为了简洁省略了“数组”,因为在这种情况下它是暗示的。每个char
是UTF-8符号的一个字节,可能是一个或多个字节。 - Ben Hymerschar*
,为什么要引入 wchar
,而 wchar
又不具备可移植性? - overexchangewchar_t
是32位 - 这不是标准的,在其他平台和编译器上不能依赖它。我不会再回复了 - 显然我正在浪费时间,因为你已经深入文档中了。祝你好运。 - Ben HymersWCHAR
(或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在互联网上广泛使用,并且在不同平台之间交换UTF-8文本时,您不必考虑字节序问题(与UTF-16相反,您必须考虑UTF-16BE 大端和UTF-16LE 小端情况)。
您可以使用WideCharToMultiByte()
和MultiByteToWideChar()
Win32 API在UTF-16和UTF-8之间进行转换。这些是纯C APIs,可以方便地在C++代码中进行封装,使用字符串类而不是原始字符指针,以及异常而不是原始错误代码。您可以在此处找到一个示例。
WCHAR
(或Visual C++编译器上的wchar_t
)”。 - Mr.C64wchar_t
不一定比 char
更宽。唯一的要求是 wchar_t
要足够大,以存储实现支持的最大字符集中每个成员的唯一值。因此,如果实现的最大字符集小于 256,则 wchar_t
可以为 8 位。 - bames53char
或wchar_t
实际上都代表一个单独的字符。如果你在字符串的任何地方切割,可能会在一个字符的中间切割(例如,如果你在UTF-16中的两个代理字符之间切割,或者在UTF-8中的多字节字符的任何位置切割)。而且更复杂的是,即使你在代码中正确理解了UTF-8/16编码,你仍然无法正确地切割/分割/修剪,因为一个字符可以由多个字符组成。0x00 0xF6
,UTF-8 0xC3 0xB6
),也可以由o(Unicode字符0x6F,UTF-16 0x00 0x6F
,UTF-8 0x6F
)和¨(Unicode字符0xA8,UTF-16 0x00 0xA8
,UTF-8 0xC2 0xA8
)组成。在屏幕上,它们都看起来像ö
,并且表示相同的字形。字符串中的Unicode字符与由该字符串表示的字形之间没有一对一的映射。一个单独的字形可以由多个Unicode字符组成,这些字符也可以超过两个(多个所谓的“修饰符符号”可以叠加在一起)。因此,即使按字节比较两个字符串,也可能导致不正确的结果,因为尽管字节序列可能不同,但这些字符串仍然可能表示相同的一组字形,并且用户期望它们相等,因为它们在屏幕上看起来是相等的。在开发 Windows 应用程序时,建议使用 TCHARs。TCHARs 的好处是它们可以是常规字符或宽字符,具体取决于是否设置了 Unicode 设置。一旦您使用 TCHARs,确保您使用的所有字符串操作也都以 _t 前缀开头(例如,_tcslen 表示字符串长度)。这样,您就可以确保您的代码在 Unicode 和 ASCII 环境中都能正常工作。
TCHAR
和能够在 char
和 wchar_t
之间切换的能力对于将遗留编码的程序从遗留编码的 char
迁移到 wchar_t
是有用的。 TCHAR
不应用于任何其他目的。 不应使用 TCHAR
编写新软件:新的 Windows 代码应明确使用 (UTF-8 编码的) char
或 wchar_t
。 - bames53TCHAR
的真正糟糕之处在于它既可以是 char
也可以是 wchar_t
,因为你必须编写截然不同的代码,具体取决于你使用哪个。无论你选择什么(坦白地说,除非你正在进行文本处理,否则应该选择 char
),都要使用它,而不是 TCHAR
。 - James Kanze
WCHAR
。你是指 Windows 头文件定义的WCHAR
宏吗? - David Heffernan