2012-04-13 342 views
7

我有一個非常惱人的編碼問題,使用opencsv。 當我導出csv文件時,我將字符類型設置爲'UTF-8'。opencsv CSVWriter使用UTF-8似乎不適用於多種語言

CSVWriter writer = new CSVWriter(new OutputStreamWriter("D:/test.csv", "UTF-8")); 

但是當我打開與Microsoft Office Excel 2007中的CSV文件,事實證明,它有'UTF-8 BOM'編碼?

將文件保存在記事本中並重新打開後,文件將變回UTF-8,並且其中的所有字母都顯示正常。 我想我已經足夠搜索了,但我還沒有找到任何解決方案來阻止我的文件變成'UTF-8 BOM'。有什麼想法嗎?

+1

Java本身不應該添加BOM,因爲沒有'OutputStreamWriter'構造函數需要兩個字符串我想你的代碼中缺少一些東西。 BOM是否可以成爲你寫的數據的一部分? – 2012-04-13 08:44:32

回答

13

我想你的文件有一個'沒有BOM'編碼的UTF-8。 儘管在大多數情況下它不是必需的,但是您最好將BOM編碼提供給您的文件,但在處理ms excel時只有一個明顯的例外。

FileOutputStream os = new FileOutputStream(file); 
os.write(0xef); 
os.write(0xbb); 
os.write(0xbf); 
CSVWriter csvWrite = new CSVWriter(new OutputStreamWriter(os)); 

現在你的文件將被excel理解爲utf-8 csv。

+0

處理ms excel有什麼問題? – 2017-10-12 21:42:53

+0

多年來,這一直是一個真正的麻煩!您的解決方案工作完美謝謝 – Ashley 2018-01-10 23:17:32

2

UTF-8UTF-8 Signature(錯誤地命名爲UTF-8 BOM)是相同的編碼和簽名is used only to distinguish it from any other encodings。任何unicode應用程序都應該正確處理UTF-8簽名(它是三個字節的序列EF BB BF)。

爲什麼Java專門添加了這個簽名,以及如何阻止它這樣做,我不知道。

相關問題