【问题标题】:How does C++ char distinguish ASCII and UNICODEC++ char如何区分ASCII和UNICODE
【发布时间】:2017-11-16 03:30:54
【问题描述】:

我目前正在使用 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 个字形,所以在某种程度上我的假设是有效的。

【问题讨论】:

  • ASCII 是 unicode 的子集,没有“区别”

标签: c++


【解决方案1】:

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

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

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

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

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

没有。嗯,有点。如果您有兴趣,请阅读有关 Unicode(特别是 UTF-8)的入门读物。您可以阅读实际的标准,但它巨大Wikipedia 应该足以更好地理解。

您会看到多字节字符串设置了高位。这使得正确解析多字节值成为可能。这并不是真正的浪费,因为标准的安排使得更广泛的编码通常保留给不太常见的值。

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

总结一下我的问题:c++ 是否仅通过查看它们是否为负来区分 ascii 字符和 unicode 字符?

我总结的答案是:不。“否定”是一个数字系统。您可能已经习惯了 2 的补码。编码,或不编码:没有“否定”。

【讨论】:

  • 我所说的“否定”是询问它是否只使用了可用值的一半。所以你说当 2 个字符加起来一个字符时,这两个字符总是大于 127 ?
  • 我进行了编辑以提供一些上下文和一个链接,以便您阅读有关 UTF-8 的信息。那里有关于要求向后兼容 ASCII 的标准的解释。
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 2011-01-03
  • 2011-05-27
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
相关资源
最近更新 更多