运行以下(实施例)代码

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] (char)? (int)63
test.java:10 [char] (char)? (int)229
test.java:11 string below
?
test.java:13 string above

如何保持在线路9打印输出正确的字节值(-27)?并因此收到System.out.println(s)命令(A)的期望输出。

有帮助吗?

解决方案

如果您想保留的字节的值,完全不使用阅读器,理想。为了表示在文本任意的二进制数据,并随后将其转换为二进制数据,你应该使用base16或base64编码。

不过,要解释这是怎么回事,当你调用是一个使用的默认的字符编码,这显然不包括Unicode字符U + 00E5 s.getBytes()

如果你调用s.getBytes("ISO-8859-1")随处可见,而不是s.getBytes()的,我怀疑你将得到正确的字节值...但依靠ISO-8859-1这是有点脏IMO。

其他提示

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

如果您想手动编码到您的系统上UTF-8,这样做:

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

应该得到具有{-61, -91}一个字节数组。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top