1. 下表为UTF-8编码规则表
2. 上述很重要的一个信息是下一个的first code point是接着上一个的last code point的,因此utf-8有一些看似合乎规则的编码也无法转化,譬如11000000 10000001,虽然符合双字节的规则,但其剩余的二进制表示的值小于128,所以无效【之前一直以为是移位规则之类的,会自动+128这样】
3. 这个常见的乱码符号是utf-8编码错误时产生的,对应的二进制数为11101111 10111111 10111101,共三个字节,每当utf-8编码错误时【不符合上表的规则】,每一个字节都会对应转化成三个字节的这个乱码符号,譬如执行
byte[] bBytes = new byte[20];
bBytes[0] = (byte) 0b11000000;
bBytes[1] = (byte) 0b10000001;
System.out.println(new String(bBytes, StandardCharsets.UTF_8));
会得到两个如下的乱码符号
也正因为如此,当你得到一串乱码字符时,可通过减去两倍乱码字符数来得到原字节数