c++ 以UTF-16LE編碼方式保存文件

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.csdn.net/download/Quellaaa/12393704

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章