C++ 理解c+中的wchar#t类型+;
标准上说,C++ 理解c+中的wchar#t类型+;,c++,encoding,C++,Encoding,标准上说,N3797::3.9.1[basic.basical]: Typewchar\u t是一种独特的类型,其值可以表示独特的 指定的最大扩展字符集的所有成员的代码 在受支持的区域设置中(22.3.1) 我无法想象我们如何使用那种类型。你能举一个简单的char不起作用的例子吗?我想如果我们同时使用两种不同的语言可能会有所帮助。但是对于西里尔文和拉丁语 #include <iostream> char cp[] = "LATINICA_КИРИЛЛИЦА"; int main(
N3797::3.9.1[basic.basical]
:
Typewchar\u t
是一种独特的类型,其值可以表示独特的
指定的最大扩展字符集的所有成员的代码
在受支持的区域设置中(22.3.1)
我无法想象我们如何使用那种类型。你能举一个简单的char
不起作用的例子吗?我想如果我们同时使用两种不同的语言可能会有所帮助。但是对于西里尔文
和拉丁语
#include <iostream>
char cp[] = "LATINICA_КИРИЛЛИЦА";
int main()
{
std::cout << cp; //LATINICA_КИРИЛЛИЦА
}
#包括
字符cp[]=“拉丁语字母a”;
int main()
{
std::cout对于某些语言,如英语,没有必要使用wchar\t。但是对于某些语言,如汉语,您最好使用wchar\t。
尽管char能够存储字符串,比如charp[]=”你好"代码>
但是当你在不同的计算机上运行你的程序时,尤其是在使用不同语言的计算机上,它可能会显示混乱的代码。
如果你使用wchar\u t,你可以避免这种情况。对于某些语言,如英语,没有必要使用wchar\u t。但是对于某些语言,如汉语,你最好使用wchar\u t。
尽管char能够存储字符串,比如charp[]=”你好“
但是当你在不同的计算机上运行你的程序时,尤其是在使用不同语言的计算机上,它可能会显示混乱的代码。
如果你使用wchar\u t,你可以避免这种情况。对于某些语言,如英语,没有必要使用wchar\u t。但是对于某些语言,如汉语,你最好使用wchar\u t。
尽管char能够存储字符串,比如charp[]=”你好“
但是当你在不同的计算机上运行你的程序时,尤其是在使用不同语言的计算机上,它可能会显示混乱的代码。
如果你使用wchar\u t,你可以避免这种情况。对于某些语言,如英语,没有必要使用wchar\u t。但是对于某些语言,如汉语,你最好使用wchar\u t。
尽管char能够存储字符串,比如charp[]=”你好“
但是当你在不同的计算机上运行你的程序时,尤其是在使用不同语言的计算机上,它可能会显示混乱的代码。
如果您使用wchar\u t,可以避免这种情况。这取决于您决定使用什么编码。任何单个UTF-8值都可以保存在8位字符中(尽管一个Unicode码点可以使用多个字符值来表示).从你的问题无法判断,但我猜你的编辑器和编译器会将你的字符串视为UTF-8,如果这是你想要的,那就好了
其他常见编码包括UTF-16、UTF-32、UCS-2和UCS-4,它们分别具有2字节、4字节、2字节和4字节的值。这些值不能存储在8位字符中
对于任何给定目的,使用何种编码的决定并不简单。主要考虑因素包括:
- 您的代码必须与哪些其他系统接口?它们使用什么编码
- 您想使用什么库以及它们使用什么编码?(例如xerces-c始终使用UTF-16)
- 复杂度和存储大小之间的折衷。UTF-32和UCS-4有一个有用的特性,即每个可能显示的字符都由一个值表示,因此您可以通过字符串占用的内存大小来判断字符串的长度,而无需查看其中的值(尽管这假设你把diaCric标记合并为单独的字符)但是,如果你所代表的是ASCII,它们占用的内存是UTF-8的四倍。
我建议你好好读一读
不过,wchar\u t
也有自己的问题。该标准没有规定wchar\u t
的大小,因此,当然,不同的编译器选择了不同的大小;VC++使用两个字节,而gcc(以及大多数其他)使用四个字节。宽字符文本,例如L“Hello,world,“
也有类似的混淆,VC++中的UTF-16字符串和gcc中的UCS-4字符串
为了解决这个问题,C++11引入了两种新的字符类型:
char16\u t
是一个保证为16位的字符,其文字形式为“你好,世界。”
char32\U t
是一个保证为32位的字符,其文字形式为“你好,世界。”
然而,这些都有自己的问题;特别是,
没有提供可以处理它们的控制台流(即没有u16cout
或u32cerr
)。这取决于您决定使用什么编码。任何单个UTF-8值都可以保存在8位字符中(虽然一个Unicode代码点可以用几个char
值来表示)。从您的问题中不可能看出,但我猜您的编辑器和编译器将字符串视为UTF-8,如果您希望这样做的话,也可以
其他常见编码包括UTF-16、UTF-32、UCS-2和UCS-4,它们分别具有2字节、4字节、2字节和4字节的值。这些值不能存储在8位字符中
对于任何给定目的,使用何种编码的决定并不简单。主要考虑因素包括:
- 您的代码必须与哪些其他系统接口?它们使用什么编码
- 您想使用什么库以及它们使用什么编码?(例如xerces-c始终使用UTF-16)
- 复杂度和存储大小之间的折衷。UTF-32和UCS-4有一个有用的特性,即每个可能显示的字符都由一个值表示,因此您可以通过字符串占用的内存大小来判断字符串的长度,而无需查看其中的值(尽管这假设你把diaCric标记合并为单独的字符)但是,如果你所代表的是ASCII,它们占用的内存是UTF-8的四倍。
我建议你好好读一读
wchar\u t
有自己的问题,t
#include <iostream>
char cp[] = "LATINICA_КИРИЛЛИЦА";
int main()
{
std::cout << sizeof(cp) << std::endl; //28
}