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

时间:2015-05-21 16:34:48

标签: c linux bash io 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;
}

首先运行:

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字节字符?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

第一位将告知您的角色是在0-127范围内还是在其上方。如果它为1,则表示它是unicode,将考虑16位(甚至更多)。

这个问题与:What's the difference between ASCII and Unicode?

密切相关