代码都是写给人看的,计算机只识别0、1二进制数据。

正如昨天从字符编码的背景说起,说到了字符集。今天我们就接着说说字符编码,以及以“国”字为例,来说说字符编码,解码的过程。

01

字符编码

字符编码是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。换句话说:字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

字符集

字符编码

ASCII

ASCII

ISO-8859-1

ISO-8859-1

GB2312

GB2312

GBK

GBK

Unicode

UTF-8,UTF-16,UTF-32

从第一篇中的截图也能看出,一个字符集,其实就是数字地址和其对应文字、符号之间对应关系。字符集本身就有字符编码的功能。下来重点要说下UTF-8。

由于Unicode对某些字符来说,占用字节太多,太浪费空间。所以,人们设计可变长的UTF-8编码规则来节省存储空间。UTF-8一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容。

UTF-8的编码规则很简单,只有二条:

第一,对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

第二,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码。

02

一个示例

下来,我们做一个示例。用来形象的展现下,文本编码之间的转换关系。还是用我们中国的“国”字来举例:由于是中文,那么这个“国”字,肯定在ASCII码里面不存在的;在ISO-8859-1里面也不存在的。

我们来看看“国”字在GBK里面的地址:从上面的截图能看到16进制地址是:B9FA。转换成2进制,就是10111001 11111010。而B9FA在Unicode字符集里面是一个朝鲜文。

中文字符集编码范围(字符集字符编码)(1)

而这一串二进制10111001 11111010 不符合UTF-8编码规则,所以在UTF-8里面找不到对应字符。

而“国”字在Unicode里面的字符16进制地址是:56FD。转成二进制:00000000,00000000,01010110,11111101

那么这个二进制,如果用UTF-8实现的话,逻辑应该是怎么样的呢?这个二进制串,有15位。那么在UTF-8里面用几个字节来存放呢?

第一步:将上面二进制数据从低往高按照UTF-8规则来一位一位存放。

中文字符集编码范围(字符集字符编码)(2)

第二步:继续从低往高存放位数据:

中文字符集编码范围(字符集字符编码)(3)

第三步结束后发现,在UTF-8里面,3个字节就可以存储下对应的Unicode中的“国”字。

中文字符集编码范围(字符集字符编码)(4)

如上图,灰色,表示UTF-8规则,第一个字节,3个1,表示有3个字节。第3 1位为0。淡红色的0表示高位补0。绿色表示Unicode编码用UTF-8编码实现的数据位。

也就是这个二进制,111001011001101110111101。转换为16进制后为:E59BBD

校验:我们通过网络工具,来查看下,“国”字UTF-8编码的二进制,如下图:

中文字符集编码范围(字符集字符编码)(5)

UTF-8编码转16进制,如下图:

中文字符集编码范围(字符集字符编码)(6)

可见,二进制,16进制,和我们自己推算出来的结果完全一致。

而如果用E59BBD地址,反过来在GBK字符集里面查找的话,确是什么都查找不到的。

中文字符集编码范围(字符集字符编码)(7)

由于GBK字符集总共有23940个码位。其中收录汉字和图形符号21886个。而E59BBD 10进制数字为:15047613。远远超过23940这个数字。故此,用E59BBD在GBK里面查找对应内容,肯定什么都查不到。

回到文首说的“新闻”=>“鏂伴椈”这个问题,就很容易解释了。“新闻” 两个字UTF-8编码16进制数据为:“E696B0 E997BB”。在UTF-8转换成GBK编码过程中,由于GBK是双字节编码,所以,上述16进制数据变成3个字符“E696”、“B0E9”、“97BB”。而这三个字符,在GBK字符集中对应的字符就是“鏂”、“伴”、“椈”。所以就会表现出切换编码格式后,“新闻” 变成 “鏂伴椈” 这种表象。

经过这一番分析,举例。我们对什么是ASCII,什么是GBK,什么是Unicode,什么是UTF-8可能了解的更清晰,更透彻一些了。

,