1. 前言
正常情况下,c++保存文件的编码方式一般为ANSI。但为了满足一些需求,会要求保存文件的编码方式为UTF-16LE、UTF-8或Unicode。
了解相关知识发现,决定文件编码方式主要是在于文件的BOM(Byte Order Mark)。
0xFE 0xFF => UTF-16 大端序
0xFF 0xFE => UTF-16 小端序
0x00 0x00 0xFE 0xFF => UTF-32 大端序
0xFF 0xFE 0x00 0x00 => UTF-32 小端序
0xEF 0xBB 0xBF => UTF-8
PS:编码是个复杂的问题,这里不深入解析,另开一个文章进行解析。
PPS:乱码是对于人来说的,对于机器而言,没有乱码这个概念, 之所以会出现乱码,是因为解码过程出现错误,和编码不能一一对应。
2. 实现
step1:用fopen_s函数新建一个指定编码方式的文件
fopen_s函数原型:
errno_t fopen_s( FILE** pFile, const char *filename, const char *mode ); errno_t _wfopen_s( FILE** pFile, const wchar_t *filename, const wchar_t *mode );
其中,mode的可选参数有:
"rw, ccs=UTF-16LE" 或"rw, ccs=UTF-8”或"rw, ccs=Unicode” ;
当以这种mode方式新建了文件,那么该文件就会以指定的编码方式创建文件。
step2:用fwprintf函数往文件里面写东西
【这里用fwprintf函数往里面写东西才不会出现乱码,是因为当你指定了编码方式为UTF-16时,说明这就是个多字节的编码,如果没有w,那么就会出现这个情况:编码时候是单字节,解码时候是多字节,从而出现乱码状况】
fwprintf函数原型:
int fwprintf( FILE* stream, const wchar_t* format [, argument ]... );
step3:最后用 fclose函数将文件保存关闭。
fclose函数原型: int fclose( FILE* stream );
PS:有同学需要完整例子,这里我将当时我更改的tinyXml文件放上来,当做例子哈~
见链接https://download.youkuaiyun.com/download/Quellaaa/12393704