2

我有一个 UTF-8 文件(它是一个 csv)。
我需要逐行读取这个文件做一些替换,然后逐行写入另一个文件。

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(fileFix), "ASCII")
    );
    bw.write("");   //clean current file


    BufferedReader br = new BufferedReader(new InputStreamReader(
        new FileInputStream(file),"UTF-8")
    );

    String line;
    while ((line = br.readLine()) != null) {
        line = line.replace(";", ",");
        bw.append(line + "\n");
    }

就那么简单。
问题是输出文件(fileFix)是 UTF-8,我认为它有 BOM 字符。

如何在没有 BOM 的情况下将文件编写为纯 ANSI?

使用软件(weka)读取文件时遇到的错误

在此处输入图像描述

该文件的第一行:

在此处输入图像描述

考虑一下记事本++告诉我字符集是UTF-8。如果我尝试将此文件转换为纯 ASCII(使用 Windows 记事本),则字符消失

解决方案

当您在第一行运行时:

line = line.substring(1);

删除任何 BOM 字符。

4

2 回答 2

5

听起来这是一个 BOM 问题,而不是编码问题。

您可以在编写文件时删除任何 BOM 字符,使用:

line = line.replace("\ufeff", "");

这留下了一个问题,即您是否首先准确地读取了数据......我强烈建议您不要使用FileWriterand FileReader—— 相反,使用InputStreamReaderand OutputStreamWriter,为它们明确指定编码。将阅读器编码设置为 UTF-8(假设输入文件确实是 UTF-8),并将编写器编码设置为您想要的任何内容......但老实说,我建议坚持使用 UTF-8。

另请注意,如果您使用的是 Java 7 ,您应该在finally块中关闭您的阅读器/编写器,或者使用try-with-resources语句。

于 2012-12-03T18:40:54.593 回答
1

查看http://en.wikipedia.org/wiki/Byte_order_mark替换的模式,看起来像 EF BB BF 而不是 FE FF

这个解决方案是错误的检查 Jons 回答 intsead

于 2012-12-03T19:05:57.737 回答