我有这个示例代码:
#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 个字节,而不关心它们是什么字符(或其他任何内容)。
您的终端对您的输入进行编码,并将您的输出重新解释为相同的两字节字符。
关于c - C如何区分一个字节长的字符和一个2字节长的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379529/