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

我无法理解 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) 的二进制代码?


ITMISS
浏览 143回答 1
1回答

慕村9548890

这将取决于向 发送数据的外部进程System.in。它可以是命令 shell、IDE 或其他进程。在命令 shell 的典型情况下,shell 将配置字符编码。(chcp在 Windows 上、locale charmap在 Linux 上。)字符编码确定图形字符或字形如何编码为数字。例如,Windows 计算机可能使用“Windows-1251”的“代码页”并将“Я”编码为一个字节 (0xCF)。或者,它可以使用 UTF-8 并将“Я”编码为两个字节 (0xD0 0xAF),或使用 UTF-16 并使用两个不同的字节 (0x04 0x2F)。您的结果表明,向 Java 程序发送数据的进程正在使用 UTF-8 作为编码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java