目的
記錄解決一個導出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的原用途。