作为一名程序员,有时候会在想,java是如何将一个中文字符,转化成一个byte数组,是如果从一个byte数组转化成字符的呢? 其实大家都知道utf-8英文占1个字节,中文占3个字节,GBK中文英文都占2个字节,但是我想问,比如utf-8,有谁知道一个中文字符是如何在java中转换成一个byte数组的?
好了,下面进入我们的正题:
例如;中 这个字是如何转换成一个byte数组的?
String str = "中";byte [] bs = str.getBytes("UTF-8");
首先,任意一个字符都定义在统一的unicode编码表中,unicode有65535个字符,几乎包含了所有的语言。所以‘中’在unicode中的编码为\u4E2D对应10进制为20013.
然后看下utf-8计算byte数组的算法:
var4[0] = (byte)(224 | var8 >> 12);
var4[1] = (byte)(128 | var8 >> 6 & 63);
var4[2] = (byte)(128 | var8 & 63);
第0个数组 20013>> 12 结果再和224进行或运算
20013二进制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
向右移动12位: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
224的二进制: 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
| 运算结果为: 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0
11100100的十进制为: -28
第1个数组 20013>> 6 结果再和63与运算 再和128或运算
20013二进制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
向右移动12位: 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0
63的二进制: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
& 运算结果为: 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0
128的二进制为: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
| 运算结果为: 10111000
十进制为: -72
第2个数组 20013& 63 再和128或运算
20013二进制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
63的二进制: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
& 运算结果为: 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1
128的二进制为: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
| 运算结果为: 10101101
十进制为: -83
这样3个byte数组的数字分别是 -28 -72 -83 ,大家可以通过java运行来检验下结果是否正确, 其实第0位数组算的是16位字节中的前4位,第1位数组放的5-10位字节,第2位数组放的是11-16位的字节,既 4+6+6 = 16 byte数组按照这种方式切分。
那么下面问大家一个问题:
第0位数组为什么要和224或运算?
第1位数组为什么要和128或运算?
第2位数组为什么要和128或运算?
有知道答案的大家可以在下方留言