Java App:无法正确读取iso-8859-1编码的文件


问题内容

我有一个编码为iso-8859-1的文件,其中包含诸如ô的字符。

我正在用Java代码读取此文件,例如:

File in = new File("myfile.csv");
InputStream fr = new FileInputStream(in);
byte[] buffer = new byte[4096];
while (true) {
    int byteCount = fr.read(buffer, 0, buffer.length);
    if (byteCount <= 0) {
        break;
    }

    String s = new String(buffer, 0, byteCount,"ISO-8859-1");
    System.out.println(s);
}

但是ô字符总是乱码,通常打印为?。。

我已经读过这个主题(并且在途中学到了一点),例如

但仍然无法正常工作

有趣的是,这在我的本地PC(xp)上有效,但在我的Linux机器上却无效。

我使用以下命令检查了我的jdk是否支持所需的字符集(它们是标准的字符集,因此这不是惊奇):

System.out.println(java.nio.charset.Charset.availableCharsets());

问题答案:

我怀疑您的文件 实际上 没有 编码为ISO-8859-1,或者System.out不知道如何打印字符。

我建议检查第一个,检查文件中的相关字节。要检查第二个字符,请检查字符串中的相关字符,并使用进行打印

 System.out.println((int) s.getCharAt(index));

在这两种情况下,结果 都应 为244位十进制;0xf4十六进制。

请参阅我有关Unicode调试的文章以获取一般建议(所提供的代码是C#,但很容易转换为Java,原理相同)。

顺便说一句,通常,我会InputStreamReader使用正确编码的来包装流-比“手动”创建新字符串要容易。我意识到这可能只是演示代码。

编辑:这是一种非常简单的方法来证明控制台是否可以工作:

 System.out.println("Here's the character: \u00f4");