使用supercsv写入UTF-8 BOM

5

我正在使用supercsv编写一个UTF-8编码的csv文件。 它产生了一个正常的文件,但是Excel不能识别它的UTF-8编码,因为它很傻,Excel没有带有BOM标记的情况下会丢失,所以在Excel中打开时任何特殊字符都会损坏。

有没有办法使用supercsv编写一个带有BOM的UTF-8文件? 我找不到。

谢谢

2个回答

10

由于supercsv可能会包装一个Writer:

Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
writer.write('\uFEFF'); // BOM for UTF-*
... new BeanWriter(writer, CsvPreference.STANDARD_PREFERENCE);

谢谢@JoopEggen,这正是我在寻找的。 代码如下: OutputStreamWriter o = new OutputStreamWriter(out); // BOM o.write('\uFEFF'); writer = new CsvBeanWriter(o, CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE); - allaf
@allaf 最好在新的OutputStreamWriter调用中添加UTF-8,否则将使用默认平台编码,这是不可移植的。 - Joop Eggen
太棒了,节省了我的时间! - prashanth-g

1
根据我的经验,MS Excel 总是使用默认的 MS Office 字符集打开 csv 文件。在我的情况下,即使在非 Windows 机器上(如 MS Office for OSX),它也总是使用 Windows 1252(西班牙)字符集。唯一的解决方法是使用这种字符集编写 CSV 文件。
byte[] csvFileBytes = dataObject.toCSVString().getBytes(Charset.forName("Windows-1252"));

MS Excel似乎从不使用其他字符集打开CSV文件。您可以查看此帖子:是否可能强制Excel自动识别UTF-8 CSV文件?


这是不正确的;如果文件中存在BOM,则Excel将使用正确的编码打开文件。但它默认不使用UTF-8,这是一个谜。 - fge
你确定吗?微软Excel会解释BOM文件吗? - Ricardo Vila
1
是的,我确定;尝试上面的答案,即在文件中写入任何其他内容之前编写BOM。 - fge
我曾尝试在Mac和Windows上使用带BOM的CVS文件(西班牙语版本)与MS Office 2011,但无法正常工作。这就是为什么我不得不使用Windows 1252进行编码的原因。 - Ricardo Vila
让我们在聊天中继续这个讨论 - Ricardo Vila
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接