欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 python 笔记-关于编码解码问题的解释

程序员文章站 2022-06-28 15:30:32
一、编码-解码编码通俗来讲就是用户向计算机当中输入字符,计算机去记录对应的二进制的值解码就是计算机会根据已经记录了的二进制的值,转化显示成人类可以认识的字符图像举个例子,  比如我们向计算机当中输入一个字母A,从人类的角度来看我们看到的是字母A,但是从计算机的角度来说它看到的是0100 0001(二进制表示),十六进制是0x41![在这里插入图片描述](https://img-blog.csdnimg.cn/202007131627353.png?x-oss-process=image/wate...

一、编码-解码

编码通俗来讲就是用户向计算机当中输入字符,计算机去记录对应的二进制的值
解码就是计算机会根据已经记录了的二进制的值,转化显示成人类可以认识的字符图像


**举个例子**

  比如我们向计算机当中输入一个字母A,从人类的角度来看我们看到的是字母A,但是从计算机的角度来说它看到的是0100 0001(二进制表示),十六进制是0x41

荐
                                                        python 笔记-关于编码解码问题的解释

图中左侧内容是人类的视角,右侧内容是计算机的视角

那么,为什么计算机存储的是二进制的值而不是直接将图像存储下来呢?首先我们要清楚的是,计算机去直接存储图像的话是麻烦的,存储的时候是用的是位图,但是还有一种是矢量图
就比如在上图当中的字母A,放大之后我们会发现它是一个个小方块组成的,那这个就是用位图组成的

荐
                                                        python 笔记-关于编码解码问题的解释
如果使用的是矢量图进行存储那我们就不会看到这种小方块,我们看到的就会是连续的内容,这是因为在矢量图中有专门的一个函数用来计算,它的显示是根据计算机的屏幕而制定的,等后面的文章再做详细解释吧,本次我们就先做一个了解。


二、字符集

概念:
  一个系统支持的所有抽象字符的集合(比如我们写代码的时候输入的英文字母、数字、特殊符号等内容,表面上给我们人类看的是图像,但是计算机内部存储的是一个一个的二进制机器码,而二进制的机器码和每一个图像之间是存在着一种映射关系的,把这些全部汇总起来,就是我们所说的字符集)

但是,在这有一个注意事项需要我们格外注意:

不同的字符集会把相同的机器码解码成不同的字符-----------因此,乱码由此得来

知道了字符集是什么之后,还有一个重要的概念我们需要清楚,那就是字符编码(character encoding):字符集在进行编码解码过程中要用到的规则

常见的字符集有如下几种:

字符集名称
ASCII
GB2312,GBK, GB18030
utf-8,utf-16,utf-32
UCS-2,UCS-4

下面一个一个了解:

ASCII:

实际上这个字符集的概念直接百度就可以
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)

显示一部分
荐
                                                        python 笔记-关于编码解码问题的解释
它一共有128个字符,一个字符一个字节也就是8个二进制位
但是缺点是太小

GB2312:

它收录了有6763个汉字,以及682个字符
ASCII的字符使用一个字节,新收录的汉字用两个字节
它是可以兼容ASCII字符集的
但是缺点是太小不够用,而且是变长字节数

那它是怎么进行编码的呢,这给大家看一下区位码表

荐
                                                        python 笔记-关于编码解码问题的解释
举个例子,比如汉字当中的“我”,要存入计算机的话,要怎么编码呢?

在区位码表中找到“我”的定位
荐
                                                        python 笔记-关于编码解码问题的解释
找到之后,开始处理
荐
                                                        python 笔记-关于编码解码问题的解释
那此时,“我”这个汉字就编码成功了,那如何解码呢,过程反着来就行,相应的编码解出10进制的数字,前一位的十进制数字乘以100之后加上第二的数字就得出了汉字对应的区位码
荐
                                                        python 笔记-关于编码解码问题的解释
得出区位码之后在表里一查就找到了

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在编码的时候是怎么样的一个过程

荐
                                                        python 笔记-关于编码解码问题的解释
当我在pycharm当中对字符串‘我’进行encode编码的时候,要把这个字符串转换为UTF-8的格式,编码之后这个变成了计算机能够看懂的16进制,\x 就代表是16进制,给大家画个图,说明一下
荐
                                                        python 笔记-关于编码解码问题的解释

那当我们去用这个编码之后的内容,再次进行UTF-8解码的时候,就回到了字符串‘我’

荐
                                                        python 笔记-关于编码解码问题的解释
但是,如果我们用其他的字符集去对b’\xe6\x88\x91’这个内容进行解码的话,解码出来的内容就完全不一样了

荐
                                                        python 笔记-关于编码解码问题的解释

那我们现在可以看到,已经提前抛出异常了,所以当我们要进行编码解码的时候,字符集一定要一致

荐
                                                        python 笔记-关于编码解码问题的解释
以下的这两个了解即可

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,然后再转换成最底层的二进制或者能让我们看懂的图像

荐
                                                        python 笔记-关于编码解码问题的解释

本文地址:https://blog.csdn.net/Z_love_u/article/details/107319405