经常听到unicode编码、unicode字符集……这些概念搞得我头大!遂将其梳理了一遍,并整理成文。
首先得明白字符集是字符集,编码是编码,字符集有各自的编码方式!国人经常接触到的字符集有标准ASCII字符集、GBK字符集、Unicode字符集。
我们都知道计算机底层采用二进制的形式对数据进行存储,而计算机是美国佬发明的,美国佬需要用到哪些字符呢?无非就是字母、数字、标点和特殊字符,共128个字符。使用ascii字符集就可以将其囊括。那么ascii字符集是如何进行编码的呢,如下:
字符 | 码点 | 将码点编码为二进制数据 |
---|---|---|
字符0 | 48 | 0011 0000 |
字符1 | 49 | 0011 0001 |
字符2 | 50 | 0011 0002 |
… | … | … |
字符9 | 57 | 0011 1001 |
… | … | … |
删除 | 127 | 0111 1111 |
将字符对应码点,再将码点编码为二进制数据,这样就可以实现将ascii字符集全部存储到计算机当中。
但是注意127的二进制形式为1111111,我们发现这128个ascii字符的二进制存储根本用不到8个位,但是计算机最少存1个字节(8个位),因此人为的在ascii字符集的二进制编码前补0,所以首位为0也就是ascii字符集二进制编码的特性,剩下的7位则刚好可以表示128个字符。
当计算机传入我国,ascii字符集在我国庞大的汉字库面前,显然是不够看的,因此我们自己搞了个字符集,即GBK,也就是我们常说的国标,它兼容ascii字符集,在GBK中,英文、数字等仍然采用1个字节存储,汉字则采用两个字节存储,接下来我们思考如下场景:
对“我a你”进行二进制编码,按照GBK的规矩,汉字2字节,英文1字节,其编码形式就应该是:
xxxxxxxx xxxxxxxx 0xxxxxxx xxxxxxxx xxxxxxxx
,但是这种形式的二进制数据在计算机底层该如何进行划分呢?为了解决这个问题,GBK中规定,汉字编码的第一个字节的首位必须是1,于是“我a你”的编码形式就应该是:1xxxxxxx xxxxxxxx 0xxxxxxx 1xxxxxxx xxxxxxxx
,怎么划分的问题就完美解决了。关于GBK编码大家可能还听说过GB2312字符集、 GB18030字符集,不用太纠结,下面直接给出它们之间的关系:GB2312兼容ASCII、GBK兼容GB2312、GB18030兼容GB2312和GBK,其实就是一个简单的包含关系而已,这里给出一个GBK码位分布图链接,如下:https://www.cnblogs.com/mfmdaoyou/p/6915081.html
随着计算机传入各个国家,每个国家都有自己的字符集和编码方式,这就造成了编码的混乱,此时ISO提出了解决方案,编订了Unicode(万国码),最初Unicode字符集采用UTF-32的编码方式,即采用固定4个字节表示一个字符,显然,这十分浪费存储空间,而且造成数据传输速率变慢,于是UTF-8这种编码方式应运而生,它是一种可变长的编码方案,共有四个长度区,分别是1字节、2字节、3字节和4字节,规定英文和数字占1字节,汉字占3字节,UTF-8中针对不同的长度区,有不同的编码方式,因此不同字符编码为二进制数据后是可区分的。下面给出UTF-8编码方式: