每字节读取的输入流如何工作?
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 作为编码。
我无法理解 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 作为编码。