wchar_t为什么被发明?

时间:2009-10-23 13:38:05

标签: c++ c windows

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

(如果重要:我住在Windows世界。我不知道Linux支持Unicode的做法。)

10 个答案:

答案 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_ttime_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?

相关问题