读取UTF-8文件并编写纯ANSI?

时间:2012-12-03 18:25:49

标签: java

我有一个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)读取文件时出现的错误

enter image description here

此档案的第一行:

enter image description here

考虑到notepad ++告诉我charset是UTF-8。如果我尝试使用纯ASCII(使用Windows记事本)转换此文件,则该字符会消失

解决方案

当您在第一线运行时:

line = line.substring(1);

删除任何BOM char。

2 个答案:

答案 0 :(得分:3)

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

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

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

这就留下了一个问题,即您是否正在准确地阅读数据......我强烈建议您不要使用FileWriterFileReader完全 - 而是使用InputStreamReaderOutputStreamWriter,明确指定两者的编码。将读取器编码设置为UTF-8(假设输入文件确实是UTF-8),并将编写器编码设置为您想要的任何...但我建议坚持使用UTF-8,说实话。

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

答案 1 :(得分:1)

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

此解决方案错误检查Jons回答intsead