c - C如何区分一个字节长的字符和一个2字节长的字符?

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

最佳答案

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

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

关于c - C如何区分一个字节长的字符和一个2字节长的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379529/

相关文章:

linux - cs 1.6安装linux怪异

json - 通过 jq 为每个 JSON 项运行 bash 命令

c - send()和recv()是否实现可靠的数据传输(TCP协议(protocol))?

linux - 如何为Linux开发wacom驱动程序?

c - Makefile 每次构建目标

linux - 基于另一个查询文件从一个文件中提取行 - linux

bash - 如何在bash中使用变量名生成for循环序号?

arrays - 如何使用 sed 将模式替换为整个数组?

c - 线程已停止...0x6 : read of address 0x6 处的访问冲突

c - 为什么段错误