C++ 为什么用C+输入'const char*'+;可以存储Unicode吗?

C++ 为什么用C+输入'const char*'+;可以存储Unicode吗?,c++,string,c++11,unicode,C++,String,C++11,Unicode,我可以编写如下代码: const char * a = "你好"; cout<<a; char a[] = {'你','好'}; cout<<a; const char*a=”你好"; cout这里有几个字符串编码功能。即: 1.字符编码 编码字符串的方法有很多。char不表示1字节字符。多字节字符集(MBCS)在Unicode之前已经存在了几十年,这可能是您的编译器解释文字汉字的方式。如果您查看表示此字符串的内存,您几乎肯定会看到每个字符所表示的不仅仅是1个字节 这

我可以编写如下代码:

const char * a = "你好";
cout<<a;
char a[] = {'你','好'};
cout<<a;
const char*a=”你好";

cout这里有几个字符串编码功能。即:

1.字符编码 编码字符串的方法有很多。
char
不表示1字节字符。多字节字符集(MBCS)在Unicode之前已经存在了几十年,这可能是您的编译器解释文字汉字的方式。如果您查看表示此字符串的内存,您几乎肯定会看到每个字符所表示的不仅仅是1个字节

这是一个常见的头痛问题,也是Unicode诞生的原因。所有东西都需要使用相同的字符编码来正确表示字符串。在磁盘上保存的文本文件、编译器、处理字符串的代码(以及所有库,如
std:
)之间,正在写入的流,字体…所有内容都需要在编码上达成一致

在现代,我们通过使用某种形式的Unicode来避免这种头痛

最简单的答案是,这取决于编译器如何解释源代码。它是由实现定义的,通常有一种特定于编译器的方式来指定此行为(对于msvc:)

这意味着你的第二个例子,假设每个字符都是1个字节,只有当你的编译器使用一种编码,这些字符可以放入一个字节时,才可能成功,我怀疑这是不可能的。因此,编译器将截断为1个字符,而你基本上会得到垃圾

2.无效终止

字符串一般是以C或C++结尾的null,这意味着在最后一个字符之后,一个值“代码>0”/代码>指示字符串的结尾。一个字符串“<代码> ABC < /代码>在内存中被表示为4字节:<代码> a,b,c,0 < /Calp>< 在第一个示例中,编译器会自动为您添加空终止字符


在第二个示例中,没有空终止符。因此,当您将字符串打印到控制台时,打印例程不知道字符串的长度,直到它在垃圾内存中找到空为止。

当您在代码中使用长度超过1字节的字符编写字符串文字时,编译器会为您转换它。请考虑r这是:

const char * a = "你好";
cout << strlen(a); // Prints 6
const char*a=”你好";

当你写
chara[]={你','好'};
它声明了一个包含2个元素(即2个字符)的字符数组。由于它不是以null结尾的字符串,
cout
无法正确打印,并且试图打印它会调用未定义的行为。但即使添加了null结尾符
{你', '好', '\0'};
它仍然不起作用,因为1字节的
字符不能存储汉字。事实上,如果两个单引号之间的内容超过1字节(如
'abcd'
'你'在本例中),则行为是实现定义的

但是,如果将字符括在双引号内
“你好“”它肯定是“强”>< />强:一个3字节的空终止字符串文字,但在一些字节序列中。C++标准没有指定字符串文字中使用的编码,但它通常是在其编码中的源文件中保存的任何字节,这通常是Windows和UTF中的当前ANSI代码页。8在Linux中。
std::string
const char*
包装在内部,以便对其应用相同的内容

UTF-8是一个以字节为单位的数组,因此它的底层表示形式可以是
char[]
数组和
”你好“
将是一个由6个代码单元组成的字符串。您可以使用
strlen()进行检查
.OTOH
cout
对这些字符一无所知,也不在乎是单字节字符还是更长。它只是将字节流传递给终端,终端的任务是在屏幕上显示它们。但如果它需要,它可以很容易地确定字符的长度,就像终端或文本编辑器一样,因为它是在字符编码中定义的


C++中还有许多其他字符类型:。它们对应的字符串类型是

char*
一样,
wchar\u t*
中的编码没有被标准定义,但在Windows中通常是UTF-16,在Linux中是UTF-32。建议使用
char8\u t
char16\u t
char32\u t
,无论编译器设置和源代码如何,它们都要求UTF-8/16/32编码文件编码

在您可以使用的任何编码之间转换。
还有一些旧的转换器/ / /在旧的C++标准和每个系统中的转换例程:在UNIX和Windows中,但是最好使用现代标准函数来实现可移植性< /P> 你可能想看看这些


请将错误消息包含在question@ratsafalig有多少个中文字符?字符的大小是多少?->可以存储多少个唯一的字符?第二个字符不是以null结尾的。请尝试
std::cout@idclev463035818但如果是这样的话,
cout
我现在有一个包含数据的
const wchar\u*a
,如何获取数据并将类型转换为
const char*b
?(const wchar\u*a
的字符长度超过1字节)@ratsafalig您应该使用一个转换函数,例如
MultiByteToWideChar
:有没有办法将包含汉字的
const wchar*a
转换为
const char*b
?@ratsafalig没有
wchar
,只有
wchar\t
,但是您可以转换编码,因为您只需要知道编码吗rules@ratsafalig有很多