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

C如何区分字节长字符和2字节长字符?,c,linux,bash,io,kernel,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; } 我想这都是预期的,因为p是ASCII中定义的1字节长的字

我有以下示例代码:

#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;
}
我想这都是预期的,因为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位甚至更多


这个问题与以下问题密切相关:

@DavidSchwartz这对我有什么帮助?实际上没有。UTF-8平台倾向于实现w_图表C中使用了两组不同的函数,一组用于ASCII,另一组用于UNICODE。Microsoft有一个扩展名,使用它,程序可以使用相同的名称,如TCHAR而不是char ASCII或WCHAR/WCHAR\u t/unsigned short UNICODE、\u tprintf、\u t。。。对于字符串文本,是ASCII还是UNICODE取决于项目设置。您还可以查看哪个进程正在查看第一位以确定范围?猛击如果我将标准重定向到带有>somefile.txt的文件,该怎么办?无论呈现字符串的是什么,都必须执行此检查。在你的例子中,那就是终端。我明白了,所以如果我把字节写入文本文件,无论打开它的哪个进程都需要检查它?当然。而且,unicode并不总是2字节。任何解码它的东西都需要不断检查每个字符。因此,如果我有一个哑终端,它可以将其解释为2个8位字符?但是终端如何知道这是一个2字节字符?它看第一位。因为它被设置为1,所以终端或任何正在读取字符串的东西都知道它不是ascii,并且它包含2个或更多字节。它将通过其他位的内容知道是否更多。区域设置、终端配置、猜测。想一想,当你在应用程序中硬编码并没有进一步处理这些字节的情况下输出时会发生什么。例如,您可以使用Konsole的配置文件编码设置,通过对输出进行不同的解释,反复显示运行该简单应用程序的各种字符/垃圾。
koray@koray-VirtualBox:~$ ./a.out 
1
ğ
ğ