首页 文章

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

提问于
浏览
5

我通过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();

1 回答

  • 4

    您应该知道Excel不是"open" csv文件 . 它使用默认值将它们动态转换为Excel文件 . 根据您的区域设置,这些默认值可能会有所不同 . 因此,it's never a good idea to let Excel open csv files using the defaults,因为你永远不会知道你最终会得到什么 .

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

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

    如果您-realy- -realy- -have-使用CSV,您可以考虑在csv文件的顶部添加"sep=," indicator . 但请注意,这可能会导致其他应用程序出现问题 .

相关问题