通过Excel使用UTF-8 BOM打开CSV

我用java的手段创build数据的csv文件。 而且我遇到了以下这个众所周知的问题:在Excel中通过错误的方式显示葡萄牙语字母(当双击打开时)。

我通过UTF-16LE + BOM解决了这个问题,但是excel开始将选项卡识别为列分隔符而不是逗号。

所以我查找了另外一个解决scheme,看了很多文章,其中有人说只要添加UTF-8 BOM和用UTF-8编写文件就可以完成Excel 2007及更高版本的工作。 我在我的工作计算机上试过最简单的样本,失败了。 但是当我在家用电脑上试用这个function的时候,它就像一个魅力一样。

这两台电脑都安装了相同版本的Java和操作系统Windows 7.我很困惑。 谁能告诉什么会导致这样一个奇怪的行为?

你可以在下面看到我最简单的例子:

String filename = "D:/check/test_with_bom.csv"; FileOutputStream fos = new FileOutputStream(filename); byte[] bom = new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF }; fos.write(bom); OutputStreamWriter osw = new OutputStreamWriter(fos , "UTF-8"); PrintWriter printWriter = new PrintWriter(osw); printWriter.print("Hello,Olá,ão,ção"); printWriter.close(); 

您应该知道Excel不会“打开”csv文件。 它使用默认值将它们转换为Excel文件。 这些默认值可以根据您的区域设置而有所不同。 因此, 让Excel使用默认值打开csv文件绝不是一个好主意 ,因为您永远不会知道最终结果如何。

一个更安全的方法是使用“从文本导入”方法,并明确指定分隔符,编码等等。但是,请注意,在Excel中“另存为csv”是一个更糟糕的主意,因为它不允许你指定编码,分隔符或其他任何细节。 访问做。

在美国的Windows版本的Excel中,默认的列分隔符是逗号。 在欧洲的Windows版本上,逗号被保留为十进制符号,为了避免冲突,默认使用分号作为列分隔符。

如果您-realy- -realy- -have-使用CSV,则可以考虑在csv文件的顶部添加“sep =”指标 。 但是请注意,这可能会在其他应用程序中造成问题。