最近工做中須要將一些數據寫入CSV文件中,並要使用Excel打開進行查看。測試時發現,導出的CSV文件用Excel打開後,中文字符所有是亂碼。寫入CSV文件的是UTF-8編碼的數據,文件在Linux中查看是沒有問題的,在Windows上用Excel打開卻有亂碼。在查閱資料後發現,windows系統中文本文檔的編碼格式用BOM來指定,在文件的開頭要寫入字符:EF BB BF(UTF-8的BOM編碼),這樣UTF-8編碼的文件才能被正確識別。因而修改代碼,相似下邊這樣:html
FileOutputStream fos = new FileOutputStream(new File(this.csvFileAbsolutePath)); byte [] bs = { (byte)0xEF, (byte)0xBB, (byte)0xBF}; fos.write(bs);
//寫入數據 fos.close()
在CSV文件最前端寫入BOM後,用Excel打開時就不會再有亂碼了。前端
關於BOMwindows
BOM(byte-order mark),即字節順序標記,用於標記字節序的,也就是大小端。UTF- 8以字節爲編碼單元,沒有字節序的問題,所以UTF-8不須要BOM來代表字節順序,但能夠用BOM來代表編碼方式,在Windows系統中就是使用BOM來標記文本文件的編碼方式的。UTF- 8的BOM編碼是EF BB BF,Excel發現文件開頭的EF BB BF就知道文件編碼方式是UTF- 8,所以就能正常顯示中文。測試
參考連接:this
https://blog.csdn.net/zhaozhi406/article/details/46241415編碼
https://blog.csdn.net/u014563989/article/details/53087470spa
http://www.fmddlmyy.cn/text6.html.net
https://blog.csdn.net/yutianxu1986/article/details/82595290code
https://blog.csdn.net/qq_35623773/article/details/87868608htm