首页 > 解决方案 > 为什么用 System.in 读取没有 ASCII 表示的字符不会给出两个字节的字符?

问题描述

标签: javacharacter-encodingsystem.in

解决方案


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));
}

Ideone demo

输出:

232 11101000
175 10101111
182 10110110

所以这 3 个字节遵循上述模式。


推荐阅读