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]

Type
wchar\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
    }