gpt4 book ai didi

c++ - 需要解释如何使用 C++ 在 Linux 上创建 utf-8 编码的文件

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:00 25 4
gpt4 key购买 nike

我需要一些关于在 Linux 上使用 g++ 进行文件编码的解释。

我有一个简单的代码:

int main ()
{
FILE * pFile;
char buffer[] = { 'x' , 'y' , 'z' ,'é' };
pFile = fopen ("myfile", "wt, ccs=UTF-8");
//pFile = fopen ("myfile", "wt");
fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
fclose (pFile);
return 0;
}

即使在 fopen 行中添加了“ccs=UTF-8”部分,该程序的输出文件始终以 iso-8859-1 编码。但是,如果我在 Linux 上使用 vi 创建包含这些字符的文件,生成的文件是 UTF-8 编码的(我使用命令“file myfile”查看文件的编码模式,并使用“xxd -b myfile”确认这种行为)。

所以我想理解:

1- 为什么 Linux 上的 g++ 默认不创建 UTF-8 文件?

2- 如果创建的文件未以 UTF-8 编码,ccs=UTF-8 的目的是什么?

3- 我如何根据这个简单的代码创建一个 UTF-8 文件?

谢谢。

最佳答案

您的文件可能看起来是 ISO-8859-1,但实际上不是。它只是坏了。

您的文件包含字节 A9,它是 é 的 UTF-8 表示形式的低位字节。

当你写'é'时,编译器应该警告你:

 aaa.c:4:38: warning: multi-character character constant [-Wmultichar]
char buffer[] = { 'x' , 'y' , 'z' ,'é' };
^

char 不是一个字符的类型,它是一个字节的类型。 GCC 将多字节字 rune 字视为大端整数。在这里,您立即将其转换为 char,保留最低字节:A9

(顺便说一句,ISO-8859-1 中的 éE9,而不是 A9)

您使用编码打开文件,但随后将字节 保存到其中。字节对应于 ISO-8859-1 字符 xyz©

如果你想写入字符,而不是字节,那么使用wchar_t代替char,使用fputws代替fwrite

#include <stdio.h>
#include <wchar.h>

int main ()
{
FILE * pFile;
// note final zero and L indicating wchar_t literal
wchar_t buffer[] = { 'x' , 'y' , 'z' , L'é' , 0};
// note no space before ccs
pFile = fopen ("myfile", "wt,ccs=UTF-8");
fputws(buffer, pFile);
fclose (pFile);
return 0;
}

关于c++ - 需要解释如何使用 C++ 在 Linux 上创建 utf-8 编码的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27317460/

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