通过Excel打开带有UTF-8 BOM的CSV

me1*_*111 5 java csv excel utf-8

我通过java创建带有数据的csv文件.我遇到了以下众所周知的问题:葡萄牙语中的字母在Excel中以错误的方式显示(通过双击打开时).

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

所以我查找了另一个解决方案并查看了很多帖子,其中人们说只需添加UTF-8 BOM并以UTF-8编写文件就可以完成Excel 2007及更高版本的工作.我在我的工作计算机上尝试了最简单的示例,但它失败了.但是当我在家用电脑上尝试这个时,它就像一个魅力.

两台计算机都安装了相同版本的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();
Run Code Online (Sandbox Code Playgroud)

Wou*_*ter 8

您应该知道 Excel 不会“打开” csv 文件。它使用默认值即时将它们转换为 Excel 文件。根据您的区域设置,这些默认值可能会有所不同。因此,让 Excel 使用默认值打开 csv 文件从来都不是一个好主意,因为您永远无法确定最终会得到什么。

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

在美国 Windows 版本的 Excel 中,默认的列分隔符是逗号。在欧洲 Windows 版本中,逗号是为小数符号保留的,为了避免冲突,默认情况下使用分号作为列分隔符。

如果您-真的--真的--必须- 使用 CSV,则可以考虑在 csv 文件的顶部添加“sep=,”指示符。但是,请注意这可能会导致其他应用程序出现问题。