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