通过 C 中的管道读取表情符号

JRo*_*wan 7 c pipe utf-8 emoji

我有一个管道,里面写入了无数的字符串。这些字符串是 ASCII 和表情符号的混合。我遇到的问题是我正在像这样阅读它们

char msg[100];
int length = read(fd,&msg,99);
msg[length] =0;
Run Code Online (Sandbox Code Playgroud)

但有时我猜的表情符号是多字节的,它被切成两半,然后当我打印到屏幕上时,我得到菱形问号未知的 UTF-8 符号。

如果有人知道如何防止这种情况发生,请填写;我已经搜索了一段时间了。

Lee*_*ker 9

如果您正在读取字节块,并希望输出 UTF-8 块,则您必须至少自己进行一些最小的 UTF-8 解码。要检查的最简单条件是查看每个字节(我们称之为 b),看看它是否是一个延续字节:

bool is_cont = (0x80 == (0xC0 & b));
Run Code Online (Sandbox Code Playgroud)

任何不是延续的字节都开始一个序列,该序列一直持续到下一个非延续字节。您需要一个 4 字节的缓冲区来保存块。