理解c ++中的wchar_t类型

时间:2014-10-13 05:24:57

标签: c++ encoding

标准说N3797::3.9.1 [basic.fundamental]

  

类型wchar_t是一种不同的类型,其值可以表示不同   指定的最大扩展字符集的所有成员的代码   在支持的语言环境中(22.3.1)。

我无法想象我们如何使用这种类型。你能举例说明char无法正常工作吗?我认为如果我们同时使用两种不同的语言可能会有所帮助。但是对于cyrilliclatinica

,普通字符是好的
#include <iostream>

char cp[] = "LATINICA_КИРИЛЛИЦА";

int main()
{
    std::cout << cp; //LATINICA_КИРИЛЛИЦА
}

DEMO

4 个答案:

答案 0 :(得分:2)

在您的示例中,您使用Unicode。实际上,您不仅可以键入拉丁语或西里尔语,还可以键入泰语,阿拉伯语,中文,换句话说任何Unicode符号。您的示例包含更多符号link

案例是编码。在您的示例中,您使用 char 来存储以UTF-8编码的Unicode符号。有关详细信息,请参阅this。 UTF-8向后兼容ASCII的主要优点。使用UTF-8的主要缺点是可变符号长度。

Unicode符号还有其他类型的编码。最常见的(UTF-8除外)是UTF-16UTF-32。您应该知道UTF-16编码仍然是可变长度,但代码单元现在是16位。 UTF-32编码是恒定长度。 类型 wchar_t 通常用于存储UTF-16或UTF-32编码的符号,具体取决于系统。

答案 1 :(得分:1)

这取决于您决定使用的编码。任何单个UTF-8值都可以保存在8位char中(尽管一个Unicode代码点可以使用多个char值来表示)。从你的问题中无法判断,但是我猜你的编辑和编译器正在将你的字符串视为UTF-8,如果这就是你想要的那么好。< / p>

其他常见编码包括UTF-16,UTF-32,UCS-2和UCS-4,它们分别具有2字节,4字节,2字节和4字节值。您无法将这些值存储在8位char

决定使用什么编码用于任何给定目的并不简单。主要考虑因素是:

  • 您的代码需要与哪些其他系统进行交互以及它们使用什么编码?
  • 您想要使用哪些库以及它们使用哪些编码? (例如xerces-c始终使用UTF-16)
  • 复杂性和存储大小之间的权衡。 UTF-32和UCS-4具有一个有用的属性,即每个可能显示的字符都由一个值表示,因此您可以告诉字符串的长度,从而不需要查看其中的值即可占用多少内存(尽管这样假设您考虑将diacretic标记组合为单独的字符)。但是,如果你所有的代表都是ASCII,它们占用的内存是UTF-8的四倍。

我建议Joel Spolsky's essay on Unicode作为一本好读物。

但是,

wchar_t有其自身的问题。标准没有规定wchar_t有多大,所以当然,不同的编译器选择了不同的大小; VC ++使用两个字节,gcc(以及大多数其他)使用四个字节。宽字符文字,例如L"Hello, world,"也同样混淆,VC ++中的UTF-16字符串和gcc中的UCS-4。

为了尝试清理它,C ++ 11引入了两种新的字符类型:

  • char16_t是一个保证为16位的字符,其字面值为u"Hello, world."
  • char32_t是一个保证为32位的字符,文字格式为U"Hello, world."

然而,这些都有自己的问题;特别是,<iostream>没有提供可以处理它们的控制台流(即没有u16coutu32cerr)。

答案 2 :(得分:0)

更具体地说,我将提供与问题相关的规范性参考:[N3797:8.5.2/1 [dcl.init.string]说:

  

一个窄字符类型(3.9.1),char16_t数组,char32_t的数组   数组或wchar_t数组可以用窄字符串文字初始化,   char16_t字符串文字,char32_t字符串文字或宽字符串   文字,分别或由适当类型的字符串文字   括在括号内(2.14.5)。连续性的价值   string literal初始化数组的元素。

8.5.2 / 2:

  

没有比数组元素更多的初始化器。

的情况下
#include <iostream>

char cp[] = "LATINICA_КИРИЛЛИЦА";

int main()
{
    std::cout << sizeof(cp) << std::endl; //28
}

<强> DEMO

答案 3 :(得分:-1)

对于某些语言,比如英语,没有必要使用wchar_t.but某些语言,比如中文,你最好使用wchar_t。 虽然char能够存储字符串,例如char p[] = "你好"

但是当您在不同的计算机上运行程序时,它可能会显示乱码,尤其是使用不同语言的计算机。 如果你使用wchar_t,你可以避免这种情况。