wchar_t为什么被发明?

Can*_*ith 23 c c++ windows

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

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

Aar*_*lla 17

维基百科.

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

  • 阿门.事实上,完全转储ANSI语言环境的东西.将所有文本视为utf8(如果必须,转换为输入)并使用标准C库函数.这是在C中做I18N的唯一理智方式. (8认同)
  • Nemanja,Michael Kaplan是一位多产的作家.您能否更具体地了解搜索内容? (4认同)
  • 这是错误的,但我无法准确地指出它.2个简单的反例显示了很多.在Windows上,wchar_t aka WCHAR的通用编码是UTF-16,它是(A)不是特定于语言环境的,(B)肯定是基于Unicode的.在Mac OSX上,wchar_t只保存Unicode代码点.因此,绝对不是为了向后兼容,它是两个最常见的桌面操作系统如何支持Unicode. (2认同)

sbi*_*sbi 17

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

在C++世界中,wchar_t它是自己的类型(我认为它是typedef在C中),所以你可以基于此重载函数.例如,这使得可以输出宽字符而不输出它们的数值.在VC6中,这里wchar_t只是typedeffor unsigned short,这段代码

wchar_t wch = L'A'
std::wcout << wch;
Run Code Online (Sandbox Code Playgroud)

输出65因为

std::ostream<wchar_t>::operator<<(unsigned short)
Run Code Online (Sandbox Code Playgroud)

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

std::ostream<wchar_t>::operator<<(wchar_t)
Run Code Online (Sandbox Code Playgroud)

被称为,并输出A.


Mic*_*urr 10

有一个wchar_t原因的原因几乎是一个size_t或一个time_t- 它是一个抽象,表明一个类型意图表示什么,并允许实现选择一个可以在特定平台上正确表示类型的底层类型.

注意,wchar_t不需要是16位类型 - 有平台,它是32位类型.


Tho*_*thy 8

提供诸如数据类型有意义的名称之类的东西通常被认为是一件好事.

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

char name[] = "Bob";
Run Code Online (Sandbox Code Playgroud)

比这更容易理解:

int8 name[] = "Bob";
Run Code Online (Sandbox Code Playgroud)

wchar_tint16也是一样的.


iai*_*ain 6

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

这可能会给移植项目带来问题,特别是如果你交换wchar_t和缩短,或者你交换wchar_t和xerces' XMLCh.

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

  • 顺便说一句,UNIX程序经常跳过`wchar_t`,在很多时候将文本表示为UTF-8 :) (7认同)
  • 我知道如果我再次重做我的应用程序,我会赞成utf-8而不是ucs-16/utf16. (2认同)

gnu*_*nud 6

当我阅读的相关标准,这似乎是微软fcked这一个厉害.

我的POSIX手册页<stddef.h>说:

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

因此,如果您的平台支持Unicode,则16位wchar_t是不够的.每个wchar_t应该是一个字符的不同值.因此,wchar_t从一种有用的方式工作在文本的字符级别(当然,从多语言区域解码后),在Windows平台上完全无用.

  • @jalf - `wchar_t`的重点是将mutlibyte编码解码为一个简单的表示,每个数组位置都有一个字符.Windows上指定的最大字符集是Unicode.UTF-16不是字符集,它是Unicode的编码. (5认同)
  • 我不认为这是微软实施中的一个问题,而是C++规范并不真正考虑到Unicode.Unicode中的字符集是什么?`wchar_t`是否必须能够代表所有Unicode代码点,或者只代表所有代码*单位*?在UTF16的情况下,代码单元是16位整数,所有这些都可以由Microsoft的`wchar_t`表示. (3认同)
  • 我认为宽字符串(`L"blah"`)在Windows上是UTF-16编码的.因此它能够表示完整的Unicode,但是是一种多字节编码(至少对于某些Unicode字符而言).ICBWT. (2认同)
  • 什么是"角色"?即使你有一个32位的wchar_t,组合形式的存在意味着你的字符串可能会使用多个代码点来表示用户认为是单个字符的内容. (2认同)

Nem*_*vic 5

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


归档时间:

查看次数:

7721 次

最近记录:

12 年,8 月 前