【发布时间】:2019-09-24 17:01:46
【问题描述】:
我无法理解 System.in.read() 方法的工作原理。
有这样一段代码:
public static void main(String[] args) throws IOException {
while (true){
Integer x = System.in.read();
System.out.println(Integer.toString(x, 2));
}
我知道 System.in.read() 方法从输入流中读取每一个字节。
所以当我输入'A'(U+0041, 一个字节用于存储char) - 程序输出为:
1000001 (U+0041)
1010 (NL) - it works as expected.
但是当我输入 'Я'(U+042F, 两个字节用于存储字符) - 输出是:
11010000 (byte1)
10101111 (byte2)
1010 (byte3 - NL)
字母'Я'(U+042F)的真实编码是10000101111。
为什么 11010000 10101111 (byte1 + byte2) 不是字母 'Я'(U+042F) 的二进制代码?
【问题讨论】:
-
因为
11010000 10101111是用UTF-8编码的Unicode字符U+042F。 -
一个文本流编码二进制字符。您的输入流可能是 UTF8 格式,否则 ASCII 范围不会是单字节,但也会有
00部分。阅读有关 UTF-8 的信息。 -
'A'在单字节范围内:十进制值 65,完全在单字节的 -128 到 127 数字范围内。'Я'是多字节的,因为十进制值 1,071 不能用单个字节表示。 -
附带说明,您应该在此处使用
int。没有理由将值装箱到Integer对象中。
标签: java inputstream