代码之家  ›  专栏  ›  技术社区  ›  CannibalSmith

为什么要发明wchar?

  •  23
  • CannibalSmith  · 技术社区  · 15 年前

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

    (如果重要的话:我生活在Windows世界。我不知道Linux如何支持Unicode。)

    10 回复  |  直到 12 年前
        1
  •  17
  •   sbi    15 年前

    为什么不需要wchar?它如何优于short(或\uu int16或其他类型)?

    在C++世界中, wchar_t 是它自己的类型(我认为是 typedef 在c)中,因此可以基于此重载函数。例如,这使得输出宽字符和 输出它们的数值。在VC6,在哪里 瓦查特 只是一个 类型定义 对于 unsigned short ,这个代码

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

    将输出 65 因为

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

    被调用。在较新的VC版本中 瓦查特 是一个不同的类型,所以

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

    被调用,并且输出 A .

        2
  •  17
  •   Aaron Digulla    15 年前

    Wikipedia .

    基本上,它是当前语言环境中“文本”的可移植类型(使用umlauts)。它比Unicode早,而且解决不了很多问题,所以今天,它主要是为了向后兼容而存在的。除非你必须使用它,否则不要使用它。

        3
  •  10
  •   Michael Burr    15 年前

    原因是 wchar_t 几乎是同样的原因 size_t 或A time_t -它是一个抽象,指示一个类型要表示什么,并允许实现选择一个可以在特定平台上正确表示该类型的底层类型。

    注意 瓦查特 不需要是16位类型-有一些平台是32位类型。

        4
  •  8
  •   Thomas Padron-McCarthy    15 年前

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

    什么是最好的, 烧焦 国际电信公司8 ?我想:

    char name[] = "Bob";
    

    比这更容易理解:

    int8 name[] = "Bob";
    

    这和 瓦查特 因特16 .

        5
  •  6
  •   gnud    15 年前

    在我阅读相关标准的时候,微软似乎把这一标准提高了。 非常 .

    我的POSIX主页 <stddef.h> 说:

    • 瓦查特 :其值范围可以 表示不同的宽字符 其中指定的最大字符集的所有成员的代码 编译环境支持的区域设置:空 字符的代码值为0,并且 可移植字符集的每个成员的代码值等于 它的值用作整数字符中的唯一字符时 常量。

    因此,如果您的平台支持Unicode,16位wchar_t是不够的。每个wchar-t都应该是一个字符的不同值。因此,wchar_t从一种有用的文本字符级工作方式(当然,在从locale multibyte解码之后)变成了在Windows平台上完全无用的方式。

        6
  •  6
  •   icedwater PedroMorgan    12 年前

    wchar_t 是用于存储和处理平台的Unicode字符的基元。它的大小并不总是16位。关于UNIX系统 瓦查特 是32位(可能Unix用户更可能使用额外位用于的Klingon字符:-)。

    这可能会给移植项目带来问题,特别是如果您交换 瓦查特 短的,或者如果你换车 瓦查特 西尔斯 XMLCh .

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

        7
  •  4
  •   Nemanja Trifunovic    15 年前

    为了添加到亚伦的评论中——在C++ 0x中,我们最终得到了真正的Unicode字符类型:CHAR16YT和CHAR32和T,以及Unicode字符串文字。

        8
  •  2
  •   AnT stands with Russia    15 年前

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

    作为一个侧节点(因为这是一个C问题),在C++中 瓦查特 允许您独立于 短的 也就是说,再次提供独立的重载来处理字符串和数字(例如)。

        9
  •  2
  •   Robert Tuck    15 年前

    wchar-t是Unicode标准化之前的遗留问题。不幸的是,它并不是很有用,因为编码是平台特定的(在Solaris上,是区域设置特定的!),未指定宽度。此外,不能保证utf-8/16/32 codecvt方面是可用的,或者您将如何访问它们。一般来说,对于便携设备来说,这有点像噩梦。

    显然,C++0X将支持Unicode,但以目前可能不会发生的进展速度…

        10
  •  1
  •   Community CDub    8 年前

    除了一个小的, 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? 在这个网站上。