为什么wchar_t被发明?

为什么需要wchar_t ? 如何优于short (或__int16或其他)?

(重要的是:我住在Windows世界,我不知道Linux支持Unicode。)

Solutions Collecting From Web of "为什么wchar_t被发明?"

为什么需要wchar_t? 如何优于短(或__int16或其他)?

在C ++世界中, wchar_t是它自己的类型(我认为它是C中的一个typedef ),所以你可以在这个基础上重载函数。 例如,这可以输出宽字符而不输出其数值。 在VC6中, wchar_t只是unsigned short一个typedef ,这个代码

 wchar_t wch = L'A' std::wcout << wch; 

会输出65因为

 std::ostream<wchar_t>::operator<<(unsigned short) 

被调用。 在较新的VC版本中, wchar_t是一个独特的类型,所以

 std::ostream<wchar_t>::operator<<(wchar_t) 

被称为,并输出A

参见维基百科 。

基本上,它是在当前语言环境(带变音符号)的“文本”的便携式类型。 它早于Unicode,并没有解决许多问题,所以今天,它主要是为了向后兼容而存在的。 除非必须,否则不要使用它。

有一个wchar_t的原因与size_ttime_t原因几乎相同 – 它是一个抽象,指示类型将表示什么,并允许实现选择可以在特定平台上正确表示类型的底层类型。

请注意, wchar_t不需要是16位类型 – 有32位类型的平台。

给数据类型赋予有意义的名字通常被认为是一件好事。

什么是最好的, charint8 ? 我认为这:

 char name[] = "Bob"; 

比这更容易理解:

 int8 name[] = "Bob"; 

这与wchar_tint16是一样的。

在我阅读相关标准的时候,微软看起来好像很糟糕

我的POSIX <stddef.h> manpage说:

  • wchar_t :整数类型,其值的范围可以代表编译环境支持的语言环境中指定的最大字符集的所有成员的不同宽字符代码:空字符的代码值为0,便携字符的每个成员当用作整数字符常量中的孤立字符时,set的值等于其值。

因此,如果您的平台支持Unicode,则16位wchar_t是不够的。 每个wchar_t应该是一个字符的不同值。 因此,wchar_t从文本的字符级别(当然是从本地多字节解码之后)转变为在Windows平台上完全无用的方式。

wchar_t是存储和处理平台unicode字符的原语。 它的大小并不总是16位。 在unix系统上, wchar_t是32位(也许unix用户更可能使用额外的位用于:-)的klingon字符集。

这可能会造成移植项目的问题,特别是如果您交换wchar_t和short,或者如果您交换wchar_t和xerces的XMLCh

因此,将wchar_t作为不同类型的wchar_t对于编写跨平台代码非常重要。 清理这个是将应用程序移植到unix,然后从VC6移植到VC2005中最困难的部分之一。

要添加到Aaron的评论 – 在C ++ 0x我们终于得到真正的Unicode字符类型:char16_t和char32_t以及Unicode字符串文字。

从某种意义上说,它是“优越的”,它允许你分离上下文:你在字符上下文(比如字符串)中使用wchar_t ,并且在数字上下文(数字)中使用short 。 现在,编译器可以执行类型检查,以帮助您捕获错误地混合另一个的情况,例如将short s的抽象非字符串数组传递给字符串处理函数。

作为一个边节点(因为这是一个C问题),在C ++中, wchar_t允许你独立于short来重载函数,也就是说,提供独立的重载,例如字符串和数字。

wchar_t是unicode标准化之前的一点遗憾。 不幸的是,这不是很有用,因为编码是特定于平台的(在Solaris上,特定于语言环境的!),宽度没有指定。 另外,不保证utf-8/16/32 codecvt facets可用,或者确实如何访问它们。 一般来说,这对便携式使用来说是一个噩梦。

显然c ++ 0x将支持unicode,但在目前的进展速度,可能永远不会发生…

除了少量的ISO 2022日本少数民族之外 ,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不是意味着被发送到磁盘或网络,它只是用在内存中。

另请参见UTF-16应该被认为是有害的吗? 在这个网站上。