Как работает входной поток на чтение байтов? - PullRequest
0 голосов
/ 24 сентября 2019

Я не могу понять, как работает метод 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)?

1 Ответ

2 голосов
/ 24 сентября 2019

Это будет зависеть от внешнего процесса, отправляющего данные на System.in.Это может быть командная оболочка, IDE или другой процесс.

В типичном случае командной оболочки для оболочки будет настроена кодировка символов.(chcp в Windows, locale charmap в Linux.)

Кодировка символов определяет способ кодирования графического символа или глифа в виде числа.Например, машина с Windows может использовать «кодовую страницу» «Windows-1251» и кодировать «Я» как один байт (0xCF).Или он может использовать UTF-8 и кодировать «Я» как два байта (0xD0 0xAF), или UTF-16 и использовать два разных байта (0x04 0x2F).

Ваши результаты показывают, что процесс отправляет данные вваша Java-программа использует UTF-8 в качестве кодировки.

...