当前位置: 首页 > 面试题库 >

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

漆雕誉
2023-03-14
问题内容

我有一个编码为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/

但仍然无法正常工作

有趣的是,这在我的本地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");


 类似资料:
  • 我在Spring项目中遇到编码问题。现在我使用 -Dfile.encoding=ISO-8859-1 参数运行 jvm (tomcat)。在我的.jsp文件中有几行: 在 Web 中.xml我定义了编码过滤器 但当我用波兰语字母łśżź传递值时,我遇到了一个问题。在我的java控制器中,打印(并保存在DB中)的值是用html代码代替抛光字母。例如 aaalł保存为aaal[am]#322;[上午]

  • 主要内容:ISO-8859-1,HTML 预留字符,ISO 8859-1 字符实体现代的浏览器支持的字符集: ASCII 字符集 标准 ISO 字符集 数学符号、希腊字母、其他符号 ISO-8859-1 ISO-8859-1 是大多数浏览器默认的字符集。 ISO-8859-1 的较低部分(从 1 到 127 之间的代码)是最初的 ASCII 字符集(0-9 的数字,大写和小写英文字母表,以及一些特殊字符)。 ISO-8859-1 的较高部分(从 160 到 255 之间的代码)

  • 我有一个Android应用程序,它读取带有SQL脚本的文件,将数据插入SQLite数据库。然而,我需要知道这个文件的详细编码,我有一个从SQLite读取信息的EditText,如果编码不正确,它将显示为无效字符,如“?”而不是像“ç,í,ã”这样的字符。 我有以下代码: 这适用于“ISO-8859-1”编码,如果我将“UTF-8”设置为字符集,则适用于UTF-8。我需要以编程方式检测字符集编码(U

  • Unicode是ISO-8859-1的超集,因此前256个Unicode字符对应于ISO-8859-1。

  • 我很难使用XSLT(使用氧气运行转换)从UTF-8编码的XML源生成ISO-8859-1编码的文本输出。 例如,当源包含破折号时,oxyow会抛出一个错误,“输出字符在此编码中不可用(十进制8211)”。 有简单明了的解决办法吗? 谢谢你的任何建议。

  • 问题内容: 我在评论 @Esailija回答我的一个问题时读到 ISO-8859-1是唯一完全保留原始二进制数据的编码,其字节<->代码点精确匹配 我也在@AaronDigulla的这个答案中读到: 在Java中,ISO-8859-1(也称为ISO-Latin1)是1:1映射 我需要对此有一些了解。这将失败: 问题 我承认我不太了解它- 为什么它没有得到上面代码中的字节 ? 最重要的是, 这是哪里