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

C++ 需要说明如何在linux上使用c+创建utf-8编码文件+;,c++,linux,encoding,utf-8,C++,Linux,Encoding,Utf 8,我需要一些关于在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);

我需要一些关于在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中的
ee
E9
,而不是
A9

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

如果要写入字符而不是字节,请使用
wchar\u 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;
}
#包括
#包括
int main()
{
文件*pFile;
//注意最后的零和L表示wchar\u t literal
wchar_t buffer[]={'x','y','z',L'e',0};
//注意ccs前无空格
pFile=fopen(“myfile”、“wt、ccs=UTF-8”);
fputws(缓冲区,pFile);
fclose(pFile);
返回0;
}