14

运行以下(示例)代码

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)命令的预期输出 (å)。

4

2 回答 2

23

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

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

如果你s.getBytes("ISO-8859-1")到处打电话而不是s.getBytes()我怀疑你会得到正确的字节值......但是依靠ISO-8859-1来做这件事有点肮脏的IMO。

于 2010-06-15T08:47:09.543 回答
11

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

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

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

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

于 2010-06-15T08:52:30.017 回答