【问题标题】:Java InputStream encoding/charsetJava InputStream 编码/字符集
【发布时间】:2011-03-03 21:22:09
【问题描述】:

运行以下(示例)代码

import java.io.*;

public class test {
    public static void main(String[] args) throws Exception {
        byte[] buf = {-27};
        InputStream is = new ByteArrayInputStream(buf);
        BufferedReader r = new BufferedReader(
                new InputStreamReader(is, "ISO-8859-1"));
        String s = r.readLine();
        System.out.println("test.java:9 [byte] (char)" + (char)s.getBytes()[0] + 
                " (int)" + (int)s.getBytes()[0]);
        System.out.println("test.java:10 [char] (char)" + (char)s.charAt(0) + 
                " (int)" + (int)s.charAt(0));
        System.out.println("test.java:11 string below");
        System.out.println(s);
        System.out.println("test.java:13 string above");
    }
}

给我这个输出

test.java:9 [字节](字符)? (int)63 test.java:10 [char] (char)? (int)229 test.java:11 下面的字符串 ? test.java:13 上面的字符串

如何在第 9 行打印输出中保留正确的字节值 (-27)?并因此收到 System.out.println(s) 命令 (å) 的预期输出。

【问题讨论】:

    标签: java encoding iso-8859-1


    【解决方案1】:

    如果您想保留 byte 值,最好不要使用 Reader。要在文本中表示任意二进制数据并稍后将其转换回二进制数据,您应该使用 base16 或 base64 编码。

    但是,为了解释发生了什么,当您调用 s.getBytes() 时,它使用的是 默认 字符编码,显然不包括 Unicode 字符 U+00E5。

    如果你在任何地方都调用s.getBytes("ISO-8859-1") 而不是s.getBytes() 我怀疑你会取回正确的字节值...但是依靠 ISO-8859-1 来实现这一点有点脏 IMO。

    【讨论】:

    • s.getBytes("ISO-8859-1") 成功了,谢谢。我只是用它来追踪我正在读取的文件内容在从读取文件到向用户呈现数据的路径中发生变化的位置。
    • @Tobbe:很高兴它有帮助。不过,将来最好不要将其转换为文本。当然,除非它真的一个 ISO-8859-1 编码的文本文件。
    【解决方案2】:

    如上所述,getBytes()(无参数)使用 Java 平台默认编码,可能不是 ISO-8859-1。只要您的终端和默认编码匹配并支持该字符,只需打印它就可以工作。例如,在我的系统上,终端和默认 Java 编码都是 UTF-8。你看到一个“?”的事实表示您的不匹配或不支持 å。

    如果您想在系统上手动编码为 UTF-8,请执行以下操作:

    String s = r.readLine();
    byte[] utf8Bytes = s.getBytes("UTF-8");
    

    它应该给出一个带有{-61, -91}的字节数组。

    【讨论】:

    • getBytes() 使用平台默认编码 iff 调用无参数版本。
    猜你喜欢
    • 2013-11-10
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多