每字节读取的输入流如何工作?

How does inputstream per byte reading work?

我无法理解 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, 一个字节用于存储字符) - 程序输出是:

 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)的二进制码?

这将取决于向 System.in 发送数据的外部进程。它可以是命令 shell、IDE 或另一个进程。

在命令 shell 的典型情况下,shell 将配置字符编码。 (chcp Windows,locale charmap Linux。)

字符编码决定了图形字符或字形如何编码为数字。例如,Windows 机器可能使用 "Windows-1251" 的 "code page" 并将“Я”编码为一个字节 (0xCF)。或者,它可以使用 UTF-8 并将“Я”编码为两个字节 (0xD0 0xAF),或 UTF-16 并使用两个不同的字节 (0x04 0x2F)。

您的结果表明,向您的 Java 程序发送数据的进程正在使用 UTF-8 作为编码。