字符编码学习

最近遇到了一些乱码问题,所以想了解一下编码,在B站看了视频,在此总结记录。

常见的编码有很多,如ASCII,UTF8,GBK,GB2312等等,下面来说编码的演进过程。

ASCII编码

由于计算机是美国人发明的,所以一开始只需要字母、数字、标点符号这些,所以设计了ASCII编码。

ASCII编码把字符由0-127进行编码,这个编码称之为码位,然后将码位翻译成对应2进制数字存储在计算机中,每个字符大小位8位,共1bit。

ASCII编码一共由95个可见字符和33个控制字符。

扩展ASCII码

随着计算机的发展,欧洲人也开始使用计算机了,但是ASCII码只能表示128个字符,所以由发明了扩展ASCII。扩展ASCII码相对于ASCII码的区别是首位位1,ASCII码首位为0。

扩展ASCII码表示的码位为128-255。

GB2312、GBK

由于扩展ASCII编码最多也只能表示256个字符,而中文由成千上万个字符,扩展ASCII有点不够用了,所以设计了GB2312编码。

GB2312字符及分为94个区,每个区分为94个位,具体每个区位存储的内容见下面几张图。

知道了每个字符的码位,接着就要把码位转换为编码。转换规则为高八位与低八位同时加上0XA0得到结果,如下图中的侃字。

为什么加上0XA0的原因:

GB2312 是双字节编码,为了与 ASCII 码区分开,字节的第8位必须是1,所以GB2312是8位编码。

所以至少要从 0x80(128, 1000 0000) 开始吧,但是根据上面的规定,0x80 - 0x9f 要留给控制块,所以只能从 0xA0 开始咯。

由于GB2312最多只能表示6763个汉字,但是中文字符不止这么多,所以出现了GBK编码,GBK不再规定低位大于127。

Unicode标准

由于世界上还有其他国家也要使用计算机,每个国家都设计一套编码规则不利于信息交流,于是出现了Unicode,

Unicode是一个标准,它包含了字符集和编码规则。

它最开始定义了UCS-2字符集,UCS-2最多可以表示2^16字符,共65536个,但是还是不能把世界上所有的字符包含进来。

于是由定义了UCS-4字符集,它用32为来表示一个字符,可以表示2^32个,大约43亿个字符,基本上可以包含世界上所有的字符了。

UTF编码

先看最简单的UTF-32

UTF-32 采用的定长四字节则是 32 位,所以它表示所有的码点不但毫无压力,反而绰绰有余,所以只要把码点的表示形式以前补 0 的形式补够 32 位即可。这种表示的最大缺点是占用空间太大

接下来看UTF-8

UTF-8是一种变长的编码格式,它可以由1-4个字节组成,采用高位保留方式来区别不同变长。

怎样确定某个字符到底是几个字节?

1. 一字节有效编码位有 7 位,2^7=128,码点 U+0000~U+007F(0~127)使用一字节。

一字节留给了 ASCII,所以 UTF-8 兼容 ASCII。

2. 二字节有效编码位只有 5+6=11 位,最多只有 2^11=2048 个编码空间,所以数量众多的汉字是无法容身于此的了。码点 U+0080~U+07FF(128~2047)使用二字节。

注意:这里码点从 128~2047,因为去掉了一字节的码点,所以不会占满 2048 个编码空间,是有冗余的,但你不能把适用于一字节的码点放到这里来编码。下同。

3. 三字节模式可看到光是保留位就达到 4+2+2=8 位,相当一字节,所以只剩下两字节 16 位有效编码位,它的容量实际也只有 65536。码点 U+0800~U+FFFF(2048~65535)使用三字节编码。

我们前面说到,一些汉字字典收录的汉字达到了惊人的 10 万级别。基本上,常用的汉字都落在了这三字节的空间里,这就是我们常说的汉字在 UTF-8 里用三字节表示。当然了,这么说并不严谨,如果这 10 万的汉字都被收录进来的话,那些偏门的汉字自然只能被挤到四字节空间上去了。

4. 四字节的可以看到它的有效位是 3+6+6+6=21 位,前面说到最大的码点 10FFFF 也是 21 位,U+FFFF 以上的增补平面的字符都在这里来表示。

按照 UTF-8 的模式,它还可以扩展到 5 字节,乃至 6 字节变长,但 Unicode 说了码点就到 10FFFF,不扩充了,所以 UTF-8 最多到四字节就足够了。

疑问:如何根据字符找到码点呢?

找到码点后,转换为UTF-8二进制就简单了,下图举例说明了转换方法。

总结

本文讲述了下列几种字符编码以及字符与二进制的转换。

  • ASCII
  • 扩展ASCII
  • GB2312
  • GBK
  • UTF

其中可以用于存储中文的是GB2312、GBK、UTF。如果文章中大部分是中文推荐使用GBK编码格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值