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?
我有这个示例代码:
#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?