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](字符)?(整数)63test.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