标准说N3797::3.9.1 [basic.fundamental]
:
类型
wchar_t
是一种不同的类型,其值可以表示不同 指定的最大扩展字符集的所有成员的代码 在支持的语言环境中(22.3.1)。
我无法想象我们如何使用这种类型。你能举例说明char
无法正常工作吗?我认为如果我们同时使用两种不同的语言可能会有所帮助。但是对于cyrillic
和latinica
#include <iostream>
char cp[] = "LATINICA_КИРИЛЛИЦА";
int main()
{
std::cout << cp; //LATINICA_КИРИЛЛИЦА
}
答案 0 :(得分:2)
在您的示例中,您使用Unicode。实际上,您不仅可以键入拉丁语或西里尔语,还可以键入泰语,阿拉伯语,中文,换句话说任何Unicode符号。您的示例包含更多符号link
案例是编码。在您的示例中,您使用 char 来存储以UTF-8编码的Unicode符号。有关详细信息,请参阅this。 UTF-8向后兼容ASCII的主要优点。使用UTF-8的主要缺点是可变符号长度。
Unicode符号还有其他类型的编码。最常见的(UTF-8除外)是UTF-16和UTF-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
。
决定使用什么编码用于任何给定目的并不简单。主要考虑因素是:
我建议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>
没有提供可以处理它们的控制台流(即没有u16cout
或u32cerr
)。
答案 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,你可以避免这种情况。