我有这个示例代码:
#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字节字符?
答案 0 :(得分:5)
C不解释它。你的程序读取2个字节并输出相同的2个字节,而不关心它们是什么字符(或其他任何字符)。
您的终端对输入进行编码,并将输出重新解释为相同的双字节字符。
答案 1 :(得分:3)
Ascii的范围是0到127. Unicode的前128个字符是ascii caracters。
第一位将告知您的角色是在0-127范围内还是在其上方。如果它为1,则表示它是unicode,将考虑16位(甚至更多)。
密切相关