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文件放上來,當做例子哈~