2012-04-13 94 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专门添加了这个签名,以及如何阻止它这样做,我不知道。