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。

以上是 Java InputStream编码/字符集 的全部内容, 来源链接: utcz.com/qa/409836.html

回到顶部