gpt4 book ai didi

c - 如何在 C 代码中使用 UTF-8?

转载 作者:太空狗 更新时间:2023-10-29 16:37:58 25 4
gpt4 key购买 nike

我的设置:gcc-4.9.2,UTF-8 环境。

以下 C 程序在 ASCII 中有效,但在 UTF-8 中无效。

创建输入文件:

echo -n 'привет мир' > /tmp/вход

这是测试.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 10

int main(void)
{
char buf[SIZE+1];
char *pat = "привет мир";
char str[SIZE+2];

FILE *f1;
FILE *f2;

f1 = fopen("/tmp/вход","r");
f2 = fopen("/tmp/выход","w");

if (fread(buf, 1, SIZE, f1) > 0) {
buf[SIZE] = 0;

if (strncmp(buf, pat, SIZE) == 0) {
sprintf(str, "% 11s\n", buf);
fwrite(str, 1, SIZE+2, f2);
}
}

fclose(f1);
fclose(f2);

exit(0);
}

查看结果:

./test; grep -q ' привет мир' /tmp/выход && echo OK

要使 UTF-8 代码像 ASCII 代码一样工作,应该做些什么 - 不要理会一个符号需要多少字节等。换句话说:在示例中要更改什么以处理任何 UTF-8 符号作为单个单元(包括 argv、STDIN、STDOUT、STDERR、文件输入、输出和程序代码)?

最佳答案

#define SIZE 10

缓冲区大小 10 不足以存储 UTF-8 字符串 привет мир。尝试将其更改为更大的值。在我的系统(Ubuntu 12.04,gcc 4.8.1)上,将其更改为 20,效果很好。

UTF-8 是一种多字节编码,每个字符使用 1 到 4 个字节。因此,使用 40 作为上面的缓冲区大小更安全。How many bytes does one Unicode character take? 有很大的讨论这可能很有趣。

关于c - 如何在 C 代码中使用 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com