需要说明如何使用 C++ 在 Linux 上创建 utf-8 编码文件
Need explanation on creating utf-8 encoded files on linux using c++
我需要一些关于在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;
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- HEX值到wchar_t字符(UTF-8)的转换
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 从 UTF-8 字节数组创建字符串?
- 需要说明如何使用 C++ 在 Linux 上创建 utf-8 编码文件
- 用c++创建和写入UTF-8文件
- 从char*创建UTF-16字符串