我有一个编码为 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);
}
但是 ô 字符总是乱码,通常打印为 ? .
我已经阅读了该主题(并在途中学到了一些东西),例如
- http://www.joelonsoftware.com/articles/Unicode.html
- http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
- http://www.ingrid.org/java/i18n/utf-16/
但仍然无法正常工作
有趣的是,这适用于我的本地电脑 (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 十六进制。
参见 my article on Unicode debugging一般建议(提供的代码是 C#,但很容易转换为 Java,原理相同)。
一般来说,顺便说一句,我会使用具有正确编码的 InputStreamReader
包装流 - 这比“手动”创建新字符串更容易。我意识到这可能只是演示代码。
编辑:这里有一个非常简单的方法来证明控制台是否可以工作:
System.out.println("Here's the character: \u00f4");
关于Java 应用程序 : Unable to read iso-8859-1 encoded file correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/498636/