荐 python 笔记-关于编码解码问题的解释
一、编码-解码
编码通俗来讲就是用户向计算机当中输入字符,计算机去记录对应的二进制的值
解码就是计算机会根据已经记录了的二进制的值,转化显示成人类可以认识的字符图像
**举个例子**
比如我们向计算机当中输入一个字母A,从人类的角度来看我们看到的是字母A,但是从计算机的角度来说它看到的是0100 0001(二进制表示),十六进制是0x41
图中左侧内容是人类的视角,右侧内容是计算机的视角
那么,为什么计算机存储的是二进制的值而不是直接将图像存储下来呢?首先我们要清楚的是,计算机去直接存储图像的话是麻烦的,存储的时候是用的是位图,但是还有一种是矢量图
就比如在上图当中的字母A,放大之后我们会发现它是一个个小方块组成的,那这个就是用位图组成的
如果使用的是矢量图进行存储那我们就不会看到这种小方块,我们看到的就会是连续的内容,这是因为在矢量图中有专门的一个函数用来计算,它的显示是根据计算机的屏幕而制定的,等后面的文章再做详细解释吧,本次我们就先做一个了解。
二、字符集
概念:
一个系统支持的所有抽象字符的集合(比如我们写代码的时候输入的英文字母、数字、特殊符号等内容,表面上给我们人类看的是图像,但是计算机内部存储的是一个一个的二进制机器码,而二进制的机器码和每一个图像之间是存在着一种映射关系的,把这些全部汇总起来,就是我们所说的字符集)
但是,在这有一个注意事项需要我们格外注意:
不同的字符集会把相同的机器码解码成不同的字符-----------因此,乱码由此得来
知道了字符集是什么之后,还有一个重要的概念我们需要清楚,那就是字符编码(character encoding):字符集在进行编码解码过程中要用到的规则
常见的字符集有如下几种:
字符集名称 |
---|
ASCII |
GB2312,GBK, GB18030 |
utf-8,utf-16,utf-32 |
UCS-2,UCS-4 |
下面一个一个了解:
ASCII:
实际上这个字符集的概念直接百度就可以
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)
显示一部分
它一共有128个字符,一个字符一个字节也就是8个二进制位
但是缺点是太小
GB2312:
它收录了有6763个汉字,以及682个字符
ASCII的字符使用一个字节,新收录的汉字用两个字节
它是可以兼容ASCII字符集的
但是缺点是太小不够用,而且是变长字节数
那它是怎么进行编码的呢,这给大家看一下区位码表
举个例子,比如汉字当中的“我”,要存入计算机的话,要怎么编码呢?
在区位码表中找到“我”的定位
找到之后,开始处理
那此时,“我”这个汉字就编码成功了,那如何解码呢,过程反着来就行,相应的编码解出10进制的数字,前一位的十进制数字乘以100之后加上第二的数字就得出了汉字对应的区位码
得出区位码之后在表里一查就找到了
GBK、GB18030字符集
GBK字符集
兼容GB2312,兼容Big5(*)→ 兼容ASCII
ASCII码的字符使用1个字节, GBK的字符使用2个字节
也是变长字节数
GB18030字符集
兼容GBK→ 兼容GB2312、兼容Big5,→ 兼容ASCII
ASCII码的字符使用1个字节,GB18030使用2字节或4字节
变长字节数
UTF-8
UTF-8之前呢是有一个字符集叫做Unicode,那它可以将世界上的任何一个字符用两个或者四个字节来表示,但是它出现的时候是不支持ASCII的,这是一个很大的问题。
那么,意识到这个问题之后推出了UTF-8
在UTF-8中,ASCII码用一个字节来表示,其他的字符使用两个到六个字节表示。兼容了ASCII,但是对于GB系列的字符集来说是相互不兼容的。
Unicode 符号范围 | UTF-8编码方式 | 备注 |
---|---|---|
0000 0000-0000 007F | 0xxxxxxx | 支持ASCII,第一位是0,最大127 |
0000 0000-0000 07FF | 110xxxxx 10xxxxxx | 有两个1,说明是双字节 |
0000 0000-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 有三个1说明是三字节 |
那这样的一个区分标识,就会造成冗余
举个例子我们来看看具体UTF-8在编码的时候是怎么样的一个过程
当我在pycharm当中对字符串‘我’进行encode编码的时候,要把这个字符串转换为UTF-8的格式,编码之后这个变成了计算机能够看懂的16进制,\x 就代表是16进制,给大家画个图,说明一下
那当我们去用这个编码之后的内容,再次进行UTF-8解码的时候,就回到了字符串‘我’
但是,如果我们用其他的字符集去对b’\xe6\x88\x91’这个内容进行解码的话,解码出来的内容就完全不一样了
那我们现在可以看到,已经提前抛出异常了,所以当我们要进行编码解码的时候,字符集一定要一致
以下的这两个了解即可
UCS-2\UTF-16字符集
UCS-2字符集是使用的固定的2字节去表示字符
它不兼容ASCII字符,每一个ASCII字符在UCS-2中使用2字节表示
UTF-16是兼容UCS-2字符集的,同时包含部分UCS-4字符集,UTF-16用两个或四个字节表示
UCS-4\UTF-32字符集
UCS-4字符集,使用固定的4字节表示字符,不兼容ASCII,每一个ASCII字符在UCS-4中使用4字节表示,也不兼容UCS-2\UTF-16等
UCS-4兼容UTF-32字符集
在python当中,直接上它在内容的编码处理是以unicode存在的,当我们在进行编码解码的时候都会先编码或解码成unicode,然后再转换成最底层的二进制或者能让我们看懂的图像
本文地址:https://blog.csdn.net/Z_love_u/article/details/107319405
上一篇: ps怎么设计平面小人牌? ps画人形指示图标的方法
下一篇: 荐 计算机组成原理中指令的四个工作周期