如何理解 `String.getBytes` 方法

public static void main(String[] args) {
        byte[] bytes = "abc中".getBytes(StandardCharsets.UTF_8);
        System.out.println(Arrays.toString(bytes));
}

运行如上所示的代码将得到如下的结果:

[97, 98, 99, -28, -72, -83]

那么问题来了,为什么拿到的是这个结果?

中 ==> 20013

查看utf8的源代码可发现,utf8单字符最多占用3个字节(byte),对应上面的结果就是 中 => [-28, -72, -83]

对于ASCII 字符表里面包含的, 就只占用一个字节。


utf8里面有一些规则:

如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。

如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。

如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节

也就是说utf8大部分只用了6位字节,最高的一位或者两位表示状态。

public static void main(String[] args) {
        byte[] bytes = "abc中".getBytes(StandardCharsets.UTF_8);
        for (byte aByte : bytes) {
            System.out.println(aByte + " --> " + Integer.toBinaryString(aByte & 0xff));
        }
    }

97 --> 1100001

98 --> 1100010

99 --> 1100011

-28 --> 11100100

-72 --> 10111000

-83 --> 10101101

如上所示, -28 -72 -83 对于的8位二进制是连在一起的,这样解码的时候就可以识别(前面三个最高位是0,自动不显示)

results matching ""

    No results matching ""