C如何区分一个字节长的字符和一个2字节长的字符?

How does C distinguish between a byte long character and a 2 byte long character?

我有这个示例代码:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(void){
    printf("%li\n",sizeof(char));
    char mytext[20];
    read(1,mytext,3);
    printf("%s",mytext);
    return 0;
}

第一个运行:

koray@koray-VirtualBox:~$ ./a.out 
1
pp
pp
koray@koray-VirtualBox:~$ 

好吧,我认为这完全符合预期,因为 p 是 ASCII 中定义的 1 个字节长的字符,而我正在读取 3 个字节。 (2 个 p 和换行符)在终端中,我再次看到 2 个字符。

现在让我们尝试使用 2 个字节长的字符:

koray@koray-VirtualBox:~$ ./a.out 
1
ğ
ğ

我不明白的是,当我将字符'ğ'发送到mytext变量指向的内存时,16位被写入该区域。由于 'ğ' 在 utf-8 中是 11000100:10011110,因此写入这些字节。

我的问题是,当打印回标准输出时,C(或者我应该说内核?)如何知道它应该读取 2 个字节并解释为 1 个字符而不是 2 个 1 字节字符?

C 不解释它。您的程序读取 2 个字节并输出相同的 2 个字节,而不关心它们是什么字符(或其他任何字符)。

您的终端对您的输入进行编码,并将您的输出重新解释为相同的两字节字符。

Ascii 范围从 0 到 127。Unicode 的前 128 个字符是 ascii 字符。

第一位会告诉你的字符是否在 0-127 范围内或以上。如果为1,则表示它是unicode,将考虑16位(或更多)。

此问题与以下问题密切相关:What's the difference between ASCII and Unicode?