为什么字符数组(char 类型)使用 unicode 字符(c++)?

Why is array of characters(char type) working with unicode characters (c++)?

当我写这段代码时:

using namespace std;

int main(){
    char x[] = "γεια σας";
    cout << x;
    return 0;
}

我注意到编译器给了我例外的输出 γεια σας 虽然数组的类型是 char,也就是说,它应该只接受 ASCII 字符。

那为什么编译器没有报错呢?

Although the type of array is char, That is, it should just accept ASCII characters.

你想错了。

Unicode 有几种转换格式。一种流行的此类格式是 UTF-8。顾名思义,UTF-8 的代码单元为 8 位宽。总是可以用char来表示UTF-8的编码单元,因为char保证至少8位宽。

您得到的 99.99% 的可能性是以 UTF-8 格式存储的 Unicode 代码点。每个代码点都变成一到四个字符。

将ASCII范围内的Unicode转换为0x00到0x7f的一个ASCII字节。有 2048 个代码点转换为二进制模式 110x xxxx 10yy yyyy 的两个字节,65536 被转换为三个代码点 1110 xxxx 10yy yyyy 10zz zzzz,其余变成四个字符 1111 0xxx 10yy yyyy 10zz zzzz 10uu uuuu.

大多数 C 和 C++ 字符串函数在 UTF-8 下工作得很好。一个例外是 strncpy 或 strncat,它们可能会创建不完整的代码点。旧的面试问题“反转字符中的字符串”变得更加复杂,因为反转代码点内的字节会产生无意义。

这里有一些代码展示了 C++ 的真正作用:

#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    char x[] = "γεια σας";
    cout << x << endl;
    
    auto len = strlen(x);
    cout << "Length (in bytes): " << len << endl;
    for (int i = 0; i < len; i++)
        cout << "0x" << setw(2) << hex << static_cast<int>(static_cast<unsigned char>(x[i])) << ' ';
    cout << endl;
    return 0;
}

输出为:

γεια σας
Length (in bytes): 15
0xce 0xb3 0xce 0xb5 0xce 0xb9 0xce 0xb1 0x20 0xcf 0x83 0xce 0xb1 0xcf 0x82 

所以字符串占用15个字节,编码为UTF-8。 UTF-8 是一种 Unicode 编码,每个字符使用 1 到 4 个字节(就最小单位而言,您可以使用文本光标 select)。 UTF-8 可以保存在 char 数组中。虽然叫char,但它基本上对应的是一个字节,而不是我们通常认为的一个字符。