今天重新学习组成原理,发现Unicode和UTF-8之间的联系原来是那么有趣,遂记录下来。
我们都知道,Unicode是为了世界各国互相通信没有阻碍而设计出的字符集,但在早年发展的时候,它的普及却很慢,因为对于那些使用英文的国家来说,用Unicode太吃亏了,原本他们使用ASCII,一个英文只需要对应一个字节就足够了,而用了Unicode,就要变成双字节。平白无故多出了一倍空间。(假如不统一长度,系统就很难分辨谁是谁了,比如ASCII:0100 1010 和GB: 0100 1010 1010 1111,对系统而言,后面它不清楚是两个ASCII 还是 一个GB了,所以ASCII前面要补0 变成 0000 0000 0100 1010 才行 ps:这个例子的编码是错的,大家知道意思就行)
但是随着互联网的不断发展,统一编码这件事是一定要面对的,于是UTF-8应运而生,UTF-8是一种针对Unicode的可变长度编码,它让英文只需要用Unicode的一个字节就行了,我们来看看它是怎么解决这个问题的。
对于英文,它只需要使用0xxxxxxx就可以表示出来,那它为什么不需要像Unicode那样补 0 使长度一样呢
原因在于每一行 xxxx 前面的数字都是不一样的,这些数字其实相当于告诉了操作系统这段数据有多长,比如第一行的是 0 就等于告诉系统它只有八位,后面的数据不属于它,第二行是 110 就是两个八位,第三行是 1110 就是三个,正因为有了这些标示使每段数据有明显的区分度,英文就可以只用一个字节来表示
我们再来看每一行的 x 的个数,第一行的 U+007F,7F 转换成二进制需要 7 位数字来表示,于是 Byte1 里面的 x 的个数恰好是 7 个,第二行 7FF 转换成二进制需要 11 位,于是 Byte1 和 2里 x 的个数加起来就是 11 个,依此类推第三行和第四行的个数 16,21都和 x 的个数是匹配的。
非常巧妙,Unicode所对应的二进制数可以刚好填进这些xxxx里,而xxxx前面的标示又使每一段数据能够区分出来。
PS:在UTF-8里,中文是需要三个字节来表示的,比GB的多了一个字节,血亏.jpg
网友评论