1.依賴衝突:Program type already present
2.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的原用途。