Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取UTF-8文件并写入普通ANSI?_Java - Fatal编程技术网

Java 读取UTF-8文件并写入普通ANSI?

Java 读取UTF-8文件并写入普通ANSI?,java,Java,我有一个UTF-8文件(它是csv)。 我需要逐行读取这个文件,做一些替换,然后逐行写入另一个文件 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(fileFix), "ASCII") ); bw.write(""); //clean current file BufferedReader br = new Buffere

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

此文件的第一行:

假设notepad++告诉我字符集是UTF-8。如果我尝试将此文件转换为纯ASCII格式(使用windows记事本),该字符将消失

解决方案 当您在第一线跑步时:

line = line.substring(1);

删除任何BOM字符。

这听起来像是BOM问题,而不是编码问题

您可以在写入文件时删除任何BOM表字符,方法是:

line = line.replace("\ufeff", "");
这就留下了一个问题,首先你是否准确地读取了数据。。。我强烈建议您根本不要使用
FileWriter
FileReader
——而是使用
InputStreamReader
OutputStreamWriter
,明确指定这两种格式的编码。将读卡器编码设置为UTF-8(假设输入文件真的是UTF-8),并将写卡器编码设置为您想要的任何值。。。但老实说,我建议坚持使用UTF-8

还请注意,您应该在
finally
块中关闭读写器,或者如果您使用的是Java 7,则使用该语句。

查看要替换的模式,看起来像EF BB BF而不是FE FF


此解决方案是错误的检查Jons answer intsead

对于任何不在ANSI编码中的字符,您希望发生什么情况?(你指的是哪一个?)@JonSkeet:我不使用任何“外来”字符。我的输入文件具有标准
A-Z0-9问题是当我用软件(weka)打开输出文件时,第一个字符似乎有些奇怪。如果我用记事本和ANSI字符集保存此文件,问题就解决了。我怀疑您指的是ASCII或ISO-8869-1编码?如果不使用任何外来字符,UTF-8与ASCII 7位相同。您的代码将删除任何文件的第一个字符。这意味着,如果它不以BOM表开头,您将丢失数据。那真是个坏主意。谢谢。我会试试的。此外,我还编辑了我的问题,我添加了一些解释图片,所以。。。我应该在while的第一个循环中添加替换吗?@yes123:也可以-你不太可能在其他地方看到字符,但这不会造成任何伤害。@JonSkeet我认为替换utf-16 bom的模式是错误的,根据@yes123:当你读取一个文件(以字节为单位)时,你指定了一个编码。将数据转换为UTF-16代码单元,而不考虑原始编码。。。因为这是Java用来存储文本的。65279=0xfeff,即0xfe,0xff=254255。这不是“二十五万四千,二百五十五”。如果你看UTF-8,你可以看到有BOM<代码>ï»
这确实是我得到的字符我试过这一行,但运气不好
line=line.replace(“\uefbbf”,”)line=line.substring(1)否,这意味着要替换字符U+FEFF。如果OP为输入正确设置了编码,我的解决方案应该可以正常工作。EF BB BF是要替换的字节集。代码不是在读取字节,而是在读取字符。使用
line.substring(1)
只是避免了使用正确的编码开始的问题。@JonSkeet:我不知道哪个是输入文件的正确字符集,但我知道会有BOM