【问题标题】:Java - Unable to read previously created encoded file correctlyJava - 无法正确读取先前创建的编码文件
【发布时间】:2016-08-09 08:22:38
【问题描述】:

我在读取以前用我自己的代码编写的编码文件时遇到问题。

正确显示原始字符串(包括重音符号)

我将字符串保存到编码文件的代码如下:

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName),
      "ISO-8859-1");
writer.write(text);

然后,我这样读取文件:

InputStream is = getClass.getResourceAsStream(fileName);

try {           
    BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1"));
    String line;
    StringBuilder sb = new StringBuilder();

    while( (line = br.readLine()) != null ) {
        sb.append(line);
    }

    String result = sb.toString();
} catch (UnsupportedEncodingException e3) {
} catch (IOException e) { }

字符串结果显示不正确。例如,缺少重音符号。

我还尝试了其他方法,例如将字符串编码为字节,然后将这些字节写入文件。我总是得到相同的结果,其他 ISO 编码也是如此。有什么想法吗?

【问题讨论】:

  • API 工作正常,你终端的编码设置肯定有其他错误。
  • 你在文件系统上写了一个文件,但读取是从资源中发生的,在类路径上,可能打包在一个 jar 或 war 中。这可能意味着您正在谈论两个不同的文件,可能一个在您的源目录中,一个在构建目录或 jar 中。阅读内容甚至可能是在书面版本之前的缓存版本。更改内容以检查。 (然后append("\r\n") 不见了,最后的电话也不见了。)
  • 无法复制。如果您读取具有与写入文件相同的编码的文件,则会得到相同的字符 - 但我必须添加一个明确的 writer.close() 才能实际写入。可能发生的情况:未按照 Joop 的建议读取预期文件,在配置错误的终端上显示其中一个文件等。但这不是 Java 转换问题。
  • 您能否提供一个示例来说明您的实际问题。尤其是textresult 的值。也许你也可以为它们提供一个十六进制字节。

标签: java file encoding writing


【解决方案1】:

问题是您的字符串有不同的字符集,可能是 UTF-16。将文本输出为所需的字符集

这个答案演示了syntax

【讨论】:

  • 您能否详细说明您的字符串具有不同的字符集,可能是 UTF-16 是什么意思?当然有! Java 规范说字符串在内部是 UTF16 编码的。但这与问题完全无关。
  • 你的问题不是为什么字符串生成器输出错误的字符吗?原因是 stringbuilder.toString 正在输出 UTF-16
  • UTF-16 的直接输出几乎只发生在 GUI 程序中,因为命令行界面在常见系统(Linux、Windows、Mac)上使用 8 位字符。当您使用System.out.println 时,字符串会自动以系统默认编码进行编码。但这确实可能是终端窗口中的编码问题。您的回答还不错,并且说明了问题所在,但您给出的理由不正确。
【解决方案2】:

问题解决了!

这与代码中的任何错误无关。我目前正在一个团队中工作,该项目是使用 Maven 制作的。

在我构建项目的那一刻,Maven 将所有资源复制到另一个文件夹,并以 UTF-8 编码。代码中,获取资源时,读取的不是原始文件,而是Maven生成的UTF-8编码文件。

很抱歉没有发布这个细节,我是 Maven 的新手,我不知道它可能会导致这种问题。

感谢大家的回答!

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2021-03-15
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2019-03-30
    • 2018-07-24
    相关资源
    最近更新 更多