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

Kor*_*gay -1 c linux io bash kernel

我有这个示例代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

第一次运行:

koray@koray-VirtualBox:~$ ./a.out 
1
pp
pp
koray@koray-VirtualBox:~$ 
Run Code Online (Sandbox Code Playgroud)

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

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

koray@koray-VirtualBox:~$ ./a.out 
1
?
?
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

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