java - 为什么用 System.in 读取没有 ASCII 表示的字符不会给出两个字节的字符?
问题描述
解决方案
UTF-8 是一种多字节变长编码。
为了让读取字节流的东西知道还有更多字节要读取以完成当前代码点,有些值不能出现在有效的 UTF-8 字节流中。基本上,某些模式表示“等等,我还没完成”。
有一张表在这里解释它。对于 U+0800 到 U+FFFF 范围内的码点,它需要 16 位来表示;它的字节表示由 3 个字节组成:
1st byte 2nd byte 3rd byte
1110xxxx 10xxxxxx 10xxxxxx
您看到232 175 182
的是因为这些是 UTF-8 编码的字节。
byte[] bytes = "诶".getBytes(StandardCharsets.UTF_8);
for (byte b : bytes) {
System.out.println((0xFF & b) + " " + Integer.toString(0xFF & b, 2));
}
输出:
232 11101000
175 10101111
182 10110110
所以这 3 个字节遵循上述模式。