需要说明如何使用 C++ 在 Linux 上创建 utf-8 编码文件

Need explanation on creating utf-8 encoded files on linux using c++

本文关键字:创建 utf-8 编码 文件 Linux 说明 何使用 C++      更新时间:2023-10-16

我需要一些关于在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 将多字节字符文本视为大端整数。在这里,您立即将其转换为 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;
}