Java InputStream编码/字符集


问题内容

运行以下(示例)代码

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 [byte](字符)?(整数)63
test.java:10 [char](char)?(整数)229
test.java:11下面的字符串
?
test.java:13字符串以上

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


问题答案:

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

但是,要说明发生了什么,请在调用时s.getBytes()使用 默认 字符编码,该编码显然不包括Unicode字符U + 00E5。

如果您打电话到s.getBytes("ISO-8859-1")任何地方,而不是s.getBytes()我怀疑您将获得正确的字节值…但是依靠ISO-8859-1进行操作则有点脏IMO。