【问题标题】:(Java) How can I read in a text file that could use various encodings and output the contents in a text file that looks normal?(Java)如何读取可以使用各种编码的文本文件并将内容输出到看起来正常的文本文件中?
【发布时间】:2017-09-10 23:35:43
【问题描述】:

我正在读取一个文件并替换一些文本,然后逐行写入一个新文件。我使用以下代码来读取和写入文件。通常 CP1252 和 UTF-8 编码的文件没有问题,但是当我尝试读取以“UCS-2 LE BOM”编码的文件时,保存的文件以 BOM 字符开头并包含大量空白.我知道这是由于编码,但我不知道我是否需要以不同的方式读取它或以不同的方式保存它。另外,我知道我可以在读取文件时设置编码,但是我如何处理不同编码的文件而不知道是哪一个。我无法控制该文件,直到它遇到我的 java 代码。任何帮助表示赞赏,谢谢。

        FileInputStream sourceFileInputStream = new FileInputStream(sourceFile);
        DataInputStream sourceDataInputStream = new DataInputStream(sourceFileInputStream);

        BufferedReader sourceBufferedReader = new BufferedReader(
                new InputStreamReader(sourceDataInputStream));
        FileWriter targetFileWriter = new FileWriter(new File(targetFileLocation));
        BufferedWriter targetBufferedWriter = new BufferedWriter(
                targetFileWriter);
                  .
                  .
                  .
        targetBufferedWriter.write(newTextline);

【问题讨论】:

  • 试试 InputStreamReader 和 OutputStreamReader。
  • 您可以使用file 命令确定正确的文件类型吗?
  • 通常您必须拥有记录文件字符编码的元数据。您不能总是检查它并确定正确的编码。但是,您可以查看前几个字节并确定是否存在 BOM 及其字节序。如果内容都在 ASCII 范围内,则无需区分 UTF-8 和 Cp1252,否则,猜测将需要读取整个文件并概率性地猜测哪个是正确的。
  • 也许这个stackoverflow.com/questions/3759356/… 主题有答案,可以帮助你吗?

标签: java encoding utf-16 ucs2


【解决方案1】:
  1. BOM 可以指示多种编码,而不仅仅是 UTF-8。见Wikipedia article Byte order mark

  2. 在没有 BOM 的情况下,您不需要阅读整个文件,您可以根据需要阅读尽可能多的内容,直到获得有意义的统计信息。通常 100 字节左右就足够了——我曾经写过一个程序来做到这一点。另一方面,即使您阅读了整个文件,统计数据也有一定的可能性。我使用的方法是基于字母频率 - 语言的单字母、双字母和三字母频率,以及编码与语言的关系。在计算二元组和三元组频率时,我建议应单独考虑空格。这将说明字母在单词开头和结尾的频率。所以对于“now is the”,二元组将是 no, o_, i, is, s, t, th, he, e。见Monogram, Bigram and Trigram frequency counts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多