为什么需要wchar_t
?它如何优于short
(或__int16
或其他)?
(如果重要:我住在Windows世界。我不知道Linux支持Unicode的做法。)
答案 0 :(得分:17)
请参阅Wikipedia。
基本上,它是当前语言环境中“text”的便携式类型(带有变音符号)。它早于Unicode,并没有解决很多问题,所以今天它主要是为了向后兼容。除非必须,否则不要使用它。
答案 1 :(得分:17)
为什么需要wchar_t?它如何优于短(或__int16或其他)?
在C ++世界中,wchar_t
是它自己的类型(我认为它是C中的typedef
),因此您可以基于此重载函数。例如,这使得输出宽字符和不可以输出它们的数值。在VC6中,wchar_t
只是typedef
的{{1}},此代码
unsigned short
会输出wchar_t wch = L'A'
std::wcout << wch;
,因为
65
被调用。在较新的VC版本中,std::ostream<wchar_t>::operator<<(unsigned short)
是一种不同的类型,所以
wchar_t
调用,输出std::ostream<wchar_t>::operator<<(wchar_t)
。
答案 2 :(得分:10)
有一个wchar_t
的原因与size_t
或time_t
几乎相同 - 它是一个抽象,表明一个类型的意图,并允许实现选择可以在特定平台上正确表示类型的基础类型。
请注意,wchar_t
不需要是16位类型 - 有些平台是32位类型。
答案 3 :(得分:8)
通常认为提供数据类型有意义的名称等内容是件好事。
什么是最好的, char 或 int8 ?我想这个:
char name[] = "Bob";
比这更容易理解:
int8 name[] = "Bob";
与 wchar_t 和 int16 相同。
答案 4 :(得分:6)
wchar_t
是用于存储和处理平台的unicode字符的原语。它的大小并不总是16位。在unix系统上wchar_t
是32位(也许unix用户更可能使用额外位用于的klingon字符: - )。
这可能会导致移植项目出现问题,尤其是在您交换wchar_t
和简短,或者交换wchar_t
和xerces'XMLCh
时。
因此,将wchar_t
作为不同类型的短片对于编写跨平台代码非常重要。清理这个是将我们的应用程序移植到unix然后从VC6移植到VC2005最困难的部分之一。
答案 5 :(得分:6)
当我阅读相关标准时,似乎微软将严重搞砸了。
POSIX <stddef.h>
的联机帮助页说明了:
- wchar_t :值范围可以的整数类型 代表鲜明的广泛性 代码中指定的最大字符集的所有成员 编译环境支持的语言环境:null character的代码值为0和 可移植字符集的每个成员具有等于的代码值 用作整数字符中的单个字符时的值 恒定。
因此,如果您的平台支持Unicode,则16位wchar_t是不够的。每个wchar_t应该是一个字符的不同值。因此,wchar_t从一种有用的方式工作在文本的字符级别(当然,从多语言区域解码后),在Windows平台上完全无用。
答案 6 :(得分:4)
要添加到Aaron的注释 - 在C ++ 0x中,我们终于获得了真正的Unicode字符类型:char16_t和char32_t以及Unicode字符串文字。
答案 7 :(得分:2)
它在某种意义上是“优越的”,它允许您分离上下文:在字符上下文中使用wchar_t
(如字符串),在数字上下文(数字)中使用short
。现在,编译器可以执行类型检查,以帮助您捕获错误地将一个与另一个混合的情况,例如将short
的抽象非字符串数组传递给字符串处理函数。
作为一个副节点(因为这是一个C问题),在C ++中wchar_t
允许你独立于short
重载函数,即再次提供与字符串和数字一起使用的独立重载(例如)。
答案 8 :(得分:2)
wchar_t在unicode标准化之前有点宿醉。不幸的是,它不是很有用,因为编码是特定于平台的(在Solaris上,特定于语言环境!),并且未指定宽度。此外,无法保证utf-8/16/32 codecvt facet可用,或者确实如何访问它们。一般来说,这对于便携式使用来说是一个噩梦。
显然c ++ 0x将支持unicode,但目前的进展速度可能永远不会发生......
答案 9 :(得分:1)
除了小ISO 2022 japanese minority之外,wchar_t总是unicode。如果你真的很焦虑,你可以在编译时确保这一点:
#ifndef __STDC_ISO_10646__
#error "non-unicode wchar_t, unsupported system"
#endif
有时wchar_t是16位UCS-2有时是32位UCS-4,那又怎样?只需使用sizeof(wchar_t)
即可。 wchar_t不是要发送到磁盘也不是发送到网络,它只是用在内存中。
另请参阅本网站上的Should UTF-16 be considered harmful?。