首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要说明如何使用c++在linux上创建utf-8编码文件。

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

Stack Overflow用户
提问于 2014-12-05 13:55:06
回答 1查看 966关注 0票数 0

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

我有一个简单的代码:

代码语言:javascript
复制
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的目的是什么?

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-05 14:35:20

您的文件可能在ISO-8859-1中,但实际上并非如此。很简单就坏了。

您的文件包含字节A9,它是UTF-8表示é的较低字节.

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

代码语言:javascript
复制
 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

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27317460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档