C++字符如何区分ASCII和UNICODE

How does C++ char distinguish ASCII and UNICODE

本文关键字:ASCII UNICODE 何区 字符 C++      更新时间:2023-10-16

我目前正在用c++编写一个同时处理字母和朝鲜语字符的程序。

然而,我了解到c++中char的大小只有1个字节。这意味着,为了处理外来字符或UNICODE,它需要为一个字符使用两个字符。

string s = string("a가b나c다");
cout<< s.length();

打印9

但我的问题是,c++执行如何区分这两种不同类型的字符?

例如,如果我制作一个9大小的char数组,它如何知道它的9个ascii字符还是4个unicode+1个ascii??

然后我发现了这个:

char c;
int a;
char* cp = "가나다라마바사아";
for (int i = 0; i < 20; i++) {
c = a = cp[i];
cout << "n c val : " << c;
cout << "n a val : " << a;
}

仅打印a.的负值

c val :
a val : -80
c val :
a val : -95
c val :
a val : -77
c val :
a val : -86
c val :
a val : -76
c val :
a val : -39

我可以推断,对于非ascii字符,它只使用负值?但这不是很浪费吗?

总之,我的问题是:c++是否只通过查看ascii字符和unicode字符是否为负数来区分它们?


总结答案:解析器通过查找字符的前几位来决定是否将1~4个字符视为1个字形,因此在某种程度上我的假设是有效的。

c++执行如何区分两种不同类型的字符?

没有。编译器决定在编译时将字符串编码为Unicode。在这种情况下,它似乎选择了UTF-8。

它如何知道它的9个ascii字符还是4个unicode+1个ascii??

同样,它没有。您的字符串包含9个字符值(不包括任何终止字符)。表示的实际"字符"(或"字形")的数量只能通过解析字符串来确定。如果您知道它是UTF-8,那么您可以相应地对其进行解析。

我可以推断出,对于非ascii字符,它只使用负值吗?但这不是很浪费吗?

否。嗯,有点。如果您感兴趣,请阅读Unicode(特别是UTF-8)入门知识。你可以阅读实际的标准,但它是巨大的。维基百科应该足以更好地理解。

您将看到多字节字符串具有高位集。这使得正确解析多字节值成为可能。这并没有那么浪费,因为标准的排列方式通常是为不太常见的值保留更宽的编码。

它输出负数的原因是您使用的是带符号的char类型。如果您转换为unsigned,您将看到这些值只是大于127。当你读到更多关于UTF-8编码的信息时,你就会明白为什么了。

我的问题是:c++是否只通过查看ascii字符和unicode字符是否为负数来区分它们?

我的回答是:不。"否定"是一个数字系统。你可能已经习惯了2的补码。编码,或者不编码:不存在"负"。