導出CSV文件時中文亂碼問題的解決


目的

記錄解決一個導出CSV文件時中文亂碼問題的過程和方法,備忘, 也希望能幫助遇到同樣問題的人。

 

問題

Android APP導出的CSV文件中,中文顯示為亂碼。

最近項目中的Anroid App需要將數據以CSV文件的形式導出。基於原來的經驗,更得益於Google的力量,很快便完成了基本功能的編碼。但就在最后測試的步驟中,問題出現了。導出CSV文件的列名中,中文全部顯示為亂碼。

首先想到的是,可能寫入文件是編碼是ASCII?顯式地修改為UTF-8,問題依舊。

用Notepad,Editplus以文本形式打開CSV文件,中文顯示正常。

 

解決方法

再次感謝萬能的Google與Baidu,經過多次的思考及搜索后。找到了問題的答案:

在文件的開頭,在寫入任何內容之前,向流中寫入 0xEF,0xBB,0xBF三個字節(此處用16進制表示)。用以告訴Excel,此CSV文件的編碼為UTF-8.

//mark the file as UTF-8 encoded
out.write(new byte[]{(byte) 0xEF, (byte) 0xBB,(byte) 0xBF});

 

原理(並非十分確定)

Excel打開CSV文件(實際為文本文件)時,需要知道文件的編碼方式(encoding)。如果未能獲取,則默認用ASCII打開。

此處的三個字節 0xEF,0xBB,0xBF為UTF-8的BOM,標明了文件是UTF-8編碼方式的,所以問題得以解決。

BOM為Byte Order Mark,是為了解決UTF-16等多字節編碼的字節序問題(big endian,little big endian),UTF-8並不需要。

但此處的0xEF,0xBB,0xBF是用做了UTF-8的標志,而非BOM的原用途。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM