我需要一些关于在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文件?
感谢。
答案 0 :(得分:1)
您的文件可能显示在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;
}