gpt4 book ai didi

c - 将 int Unicode 代码点保存到 UTF-8 文件

转载 作者:太空狗 更新时间:2023-10-29 15:52:13 24 4
gpt4 key购买 nike

上下文

Debian 64 位尝试将一个 int,例如 233 写入一个文件,并使其文本打印“é”。

问题

我无法理解如何编写一个 utf8 等效字符,例如“é”或任何比 char 类型可以包含的宽度大得多的 UTF-8 字符。该文件应该是人类可读的,以便通过网络发送。

我的目标是将一个 int 写入一个文件并获得它的 utf8 等价物。

我不知道我在做什么。

代码

FILE * dd = fopen("/myfile.txt","w");
fprintf(dd, "%s", 233); /* The file should print "é" */
fclose(dd);

谢谢

更新:

根据 Biffen 的评论,这是另一段代码,其中写入“E9”(“é”的十六进制值);

int p = 233;
char r[5];
sprintf(r,"%x",p);
printf("%s\n",r);
fwrite(r,1,strlen(r),dd);
fclose(dd);

如何将其转换为“é”?

更新最终工作代码:

UFILE * dd = u_fopen("/myfile.txt","wb", NULL, NULL);
UChar32 c = 233;
u_fputc(c,dd);
u_fclose(dd);

最佳答案

您似乎期望 printf() 了解 UTF-8,但事实并非如此。

你可以自己实现UTF-8编码,毕竟是很简单的编码。

解决方案可能如下所示:

void put_utf8(FILE *f, uint32_t codepoint)
{
if (codepoint <= 0x7f) {
fprintf(f, "%c", (char) codepoint & 0x7f);
}
else if (codepoint <= 0x7ff) {
fprintf(f, "%c%c", (char) (0xc0 | (codepoint >> 6)),
(char) (0x80 | (codepoint & 0x3f));
}
else if (codepoint <= 0xffff) {
fprintf(f, "%c%c%c", (char) (0xe0 | (codepoint >> 12)),
(char) (0x80 | ((codepoint >> 6) & 0x3f),
(char) (0x80 | (codepoint & 0x3f));
}
else if (codepoint <= 0x1fffff) {
fprintf(f, "%c%c%c%c", (char) (0xf0 | (codepoint >> 18)),
(char) (0x80 | ((codepoint >> 12) & 0x3f),
(char) (0x80 | ((codepoint >> 6) & 0x3f),
(char) (0x80 | (codepoint & 0x3f));
}
else {
// invalid codepoint
}
}

你可以这样使用它:

FILE *f = fopen("mytext.txt", "wb");
put_utf8(f, 233);
fclose(f);

然后它将0xC3和0xA9这两个字符输出到f

参见 Wikipedia有关 UTF-8 的更多详细信息。

关于c - 将 int Unicode 代码点保存到 UTF-8 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25643312/

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