上篇博客,我主要是介绍了一些关于ACII码,UNICDOE,和UTF-8,同时也留下了一个问题,就是UTF-8和UTF-16的区别。今天我特意去翻了一些关于UTF编码的文章,大概地了解了一下。
首先是UTF-32。UTF-32是一种固长的编码方式,一共有四个字节,具体的编码细节我就不说了,因为是固长的,所以你一个一字节能搞搞定的字符,它也强行占用了四个字节的空间,对内存的浪费已经到了一个可耻的地步,所以一般没有人会采用。
其次是UTF-8,UTF-8就有点意思了,我以前一直以为是用一个字节来表示字符,现在才发现这是大错特错,UTF-8是一到四个字节的变长编码方式,这个意思就是如果这个字符只需要占用一个字节,它就用一个字节表示,如果多个字节它就会用多个字节来表示。所以很多编码方式都会采用UTF-8,但是节省了空间的同时也是要付出代价的,你就需要在编解码过程多费些时间,这也是很合理的,我在上一篇有讲了一些关于UTF-8表示方式的,所以这里我就不再作具体的细节讲解。
真正的主角是这位UTF-16,可能你们会认为这个是由两个字节组成的固长编码方式,但是,现实却错的离谱。它是综合了UTF-32和UTF-8的一个结合体,怎么说呢,简单点就是它是由固长和不定长这两部分组成的。那它又是怎么个编码方式呢?
其实,UTF-16是分为两部分的,一部分是两个字节组成的基本平面字符,另一部分是由四个字节组成的辅助平面字符。所以,UTF-16要么是两个字节,要么是四个字节。单看名字简直误导人。那么UTF-16在编解码时候又是如何区分是两个字节还是四个字节呢。
基本平面其实在U+D800到U+DBFF之间是一个空段,所以UTF-16在解码时就先判断前两个字节是不是落在这个空段中,如果是,那么它后面跟着的两个字节就要一起解析,这个字符也就变成了辅助平面。如果不是,那么就按两个字符解析,同理这个字符也就是基本平面。
好了,我了解的大概是这么多,这篇博客绝对远远比不上其他前辈的讲解,如果你想要了解更多,可以去看看其他前辈写的,我也主要是做个小笔记。