【问题标题】:Right Double Quotes (”) not Being Read Correctly by BufferedReader or FileReaderBufferedReader 或 FileReader 未正确读取右双引号 (”)
【发布时间】:2018-02-14 19:01:54
【问题描述】:

我编写了一个从文本文件中读取并删除所有换行符和双空格的 Java 程序。它一直按预期工作,直到最近它必须读取一个带有“字符”的文本文件。我不知道为什么,但它把“”字符读作一个我不认识的奇怪的亚洲字符。

重现步骤:

  1. 在 input.txt 中放置一个 ” 字符

  2. 运行程序

预期结果:

”字符放在input.txt中

实际结果

在input.txt中放置了一个奇怪的字符代码

import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Main {

    public static void main(String[] args) throws IOException, UnsupportedFlavorException{

        String line = null;
        String fileName = "Input.txt";

        FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        String output = "";

        while((line = bufferedReader.readLine()) != null) {
            output += (line + "\n");
        }   


        output = output.replaceAll("-\n", "");
        output = output.replaceAll("\n", " ");
        output = output.replaceAll("  ", " ");

        System.out.println(output);

        FileWriter fileWriter = new FileWriter(fileName);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        bufferedWriter.write(output);

        bufferedReader.close();
        bufferedWriter.close();

    }
}

我可以使用 println 将 ” 字符打印到 System.out,我什至可以将其从字符转换为字符串,而无需将其更改为另一个字符。我怀疑 bufferedReader/Writer 或 fileReader/Writer 损坏了 ” 字符,尽管我在文档中找不到任何关于字符限制的信息。有没有人遇到过这个问题?真的希望它发生是因为一些非常明显的事情,我只是愚蠢。

编辑:我使用的是 Windows 10,文件使用的是 UTF-8 字符集

【问题讨论】:

  • 文件使用哪种字符集编码?
  • @MickMnemonic 根据 Notepad++,它是 UTF-8
  • 你没有说你在哪个操作系统上。如果是 Windows,则默认字符集可能是 ISO-8859-1,因此 UTF-8 输入被错误地解释。使用指定 UTF-8 的显式 InputStreamReader 并将其包裹在 FileInputStream
  • @JimGarrison 我使用的是 Windows 10,文件使用 UTF-8 编码。我会尝试使用 inputStreamReader。
  • Files.newBufferedReader,在未指定字符集时始终使用UTF-8

标签: java unicode stream ascii


【解决方案1】:

@Holger、@MickMnemonic 和@Jim 帮助在 cmets 中找到了解决方案。我把我的解决方案放在这里,以防以后有人遇到这个问题。

问题是字符集编码不一致,文件是 UTF-8 并且 BufferedReader 和 BufferedWriter 没有这样读取它。使用 Files.newBufferedReader() 和 Files.newBufferedWriter() 创建读取器和写入器会创建以 UTF-8 进行读写的 BufferedReader 和 BufferedWriter。

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 2016-06-03
    • 2018-08-04
    • 2019-10-31
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多