我不明白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()方法是从输入流PER BYTE读取的。
因此,当我输入'A'(U + 0041,一个字节用于存储char)时-程序输出为:
1000001 (U+0041)
1010 (NL) - it works as expected.
但是当我输入'Я'(U + 042F,两个字节用于存储char)时,输出为:
11010000 (byte1)
10101111 (byte2)
1010 (byte3 - NL)
字母'Я'(U + 042F)的真实代码是10000101111。
为什么11010000 10101111(byte1 + byte2)不是字母'Я'(U + 042F)的二进制代码?
答案 0 :(得分:2)
这取决于将数据发送到System.in
的外部进程。它可以是命令外壳,IDE或其他进程。
在命令外壳程序的典型情况下,外壳程序将配置字符编码。 (在Windows上为chcp
,在Linux上为locale charmap
。)
字符编码确定如何将图形字符或字形编码为数字。例如,Windows计算机可能使用"Windows-1251"的“代码页”,并将“Я”编码为一个字节(0xCF)。或者,它可以使用UTF-8并将“Я”编码为两个字节(0xD0 0xAF),也可以使用UTF-16并使用两个不同的字节(0x04 0x2F)。
您的结果表明,向Java程序发送数据的过程正在使用UTF-8作为编码。