楼主真是太细心了!佩服啊!
关于你问的问题我重新对u8码表进行了编码规范的学习,也终于找到答案了:
楼主能问这个问题说明你已经知道的了u8的基本编码规范了,当码表得到
11000001 10101010 11001101 10101000 这堆二进制描述的字节数组时,
1,首先会进行判断是否符合u8的编码规范?符合那种规范?
很显然第一个字节和第二个字节的标记来看符合了用两个字节来描述的u0000~u0080的字符集,到这里
我们通常认为码表会立即用这两个字节去匹配一个字符(当没有找到是就用一个"?"来代替),其实并非如此
,码表还会对标记符后面的字符表示位进行验证,很显然11000001的有效位只有1个位,10101010有效位有6个为,那么11000001 10101010 总共真实的有效位是7个,说明这个字符用一个字节刚好可以描述!所以码表就会用11000001去单独描述这个字符而最终没有匹配到所以用一个"?"代替.- public static void main(String[] ages)throws Exception{
- //定义一个字节数组
- byte[] bt={-63,-86};
- //输出该字节数组转换成的二进制
- for(byte b:bt){
- System.out.println(Integer.toBinaryString(b&255));
- }
- //用该字节数组去匹配UTF-8码表
- System.out.println(new String(bt,"utf-8"));
- }
复制代码 输出:11000001 10101010 ??
如果我们将字节数组值-63改成-62:- public static void main(String[] ages)throws Exception{
- //定义一个字节数组
- byte[] bt={-62,-86};
- //输出该字节数组转换成的二进制
- for(byte b:bt){
- System.out.println(Integer.toBinaryString(b&255));
- }
- //用该字节数组去匹配UTF-8码表
- System.out.println(new String(bt,"utf-8"));
- }
复制代码 输出结果:11000010 10101010 ?
重结果来看说明我们分析是对的.
2,当匹配完一个字节后,再反复按照这个规则进行匹配直到匹配完数组中全部字节为止.
所以就会出现为什么?11000001 10101010 11001101 10101000解码时不是"??"而是"???".
|