python编码与解码

之前看过编解码,但是还是理解不深,现在重新梳理一遍。

本文总体如下:

1 通俗理解什么是编解码。

或者也可以说为啥一定要编解码?编解码是不是多余的操作?

2 明白编解码的原因,那到底有哪些编解码的方式?

 主要讲ASCII和Unicode2种,重点讲由Unicode衍生出来的其他具体细分类型。


为啥要编解码?

编码

编码(encode)是用预先规定的方法  将人类现实生活中各个国家的各种文字、数字或其他字符转换成0/1数字表示的字节码的过程。

解码(decode)是编码的逆向过程。

 
举个例子,这里我们不妨将人类可以很容易理解的字符作为“明文”,将人类的明文加密成不易懂但是更易于存储和传输的消息字节作为“密文”。那么编码和解码的关系如下: 明文就是人类可以直接一眼就看得懂的字符,密文就是明文被加密后一般人无法立马看懂的字节。

è¿éåå¾çæè¿°

那为啥要在计算机里面编码解码,多费事啊?

看过《黑客帝国》的都应该记得有个镜头,电脑显示都是0/1字节流动。
那是因为计算机只能识别0和1,而我们人类易于理解的字符没办法直接存储到计算机中。所以必须先将这些字符按照事先规定的方式编码成0/1串才能存储到计算机或者通过网络进行传输(计算机才能识别,才能按照人类想要的操作指令去执行)。当我们从硬盘或者网络中读取文件时,我们读取到的内容全是0/1串(即字节码),当我们打开某个文件其实是被计算机解码后的字符,是需要将这些字节码照一定的方式解码成我们易于理解的明文(即字符),然后我们才能查看或进行相关的处理,不然计算机可以识别的二进制字节码但人类看不懂啊,那你还咋玩呢。同样,人类看的懂的字体符号(即字符),机器看不懂啊,所以你要机器按你的命令执行,那你就得先翻译成机器看的懂的话,它才能乖乖听话不是(这个过程就是编码也)

所以人类看的懂的字体符号简称字符,要想让机器看的懂并且按照我们的命令去执行,那就得先编码成机器看的懂的话,也就是编译成字节码,把字符编译成字节的过程叫做编码。

反过来,机器看的懂的话,或者机器按人类的命令操作返回了一些结果,人类看不懂啊,也得进行一次解码,解码成人类看的明白的字体符号(字符),把字节转为人类看的懂的现实生活里面的字符过程就是解码。

编码有一个必要条件是编码的过程不能丢失任何信息,我们能够从密文解码出和原文完全一样的内容。


编码方式


将人类现实生活中的字符 编码成计算机才能识别的二进制字节需要按照一定的编码方式(即字符与字节之间要按照一定的一一对应的转换规则,这样才不会乱套了嘛)。但是编码方式多种多样(有utf-32,utf-16,utf-8,gbk,gbk2312,ASCII等),分别对应于不同的字符集(不同的编码方式,有自己的各自对应的字符表,每种字符表的转换规则会不一样)。

1.1 ASCII

ASCII:American Standard Code for Information Interchange。

计算机是美国人发明的,因此最早只有127个字符被编码到计算机里,也就是西方人的大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母a的编码是97。因为他们只有那么些个字符,所以当时他们就这样规定了128个字符对应的字节表示方式。

注意:

看表格画的红圈圈,每个字符都对应一个独一无二的数字表示,这个数字再按照一定的规则用二进制来表示它们,也就是utf-32,utf-16,utf-8,gbk,gbk2312,ASCII等编码表。

 

 


1.2 其他编码,除了ASCII以外的,都是Unicode衍生出来的

ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。

后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII码允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号。

对于英语来说128个字符就已经够用了,但是对于其他国家的语言来说却不够。比如要处理中文,看看咱们的新华字典有多少字符?就那区区128个字符表,哪够啊。何况全世界的各国的韩文,印文,阿拉伯,梵文等等那么多国家,加起来得有有多少个字符啊。因此针对不同国家的语言先后出现了多种编码方式,各国有各国的标准,就不可避免地出现冲突,结果就是,在多个语言混合的同一个文本中,显示出来会有乱码。

例如针对中文的GB2312和GBK编码,针对中文繁体的Big5编码等等,这些编码方式都使用多个字节表示一个字符。

因为一个字符要对应有一个独一无二的数字去表示它,然后把数字又转换成二进制表示,那中国那么多字符那就对应的最终的那个数字必然很大,接着转为二进制肯定很长的。显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突(就是还要兼容西方人的那128个字符,不能乱码),所以中国制定了GB2312编码,用来把中文编进去。

 

简单科普一下:

字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制,它是一个8位的二进制数,是一个很具体的存储空间。

一个字节有8个比特位。将2^8字节转化为对应的数字也就是128.这也是西方国家用一个字节就够的原因,因为他们字符少,够用了。

字符:人类使用的记号,抽象意义上的一个符号。 '1', '中', 'a', '$', '¥', ……


1.3 Unicode解释


随着越来越多的编码方式的出现,急需一种能够包含全世界所有符号的编码系统来消灭乱码,因为各个国家都有自己的一套编码系统,当一个文件里面同时有2个国家的字体符号,很可能就在当前的编码系统里面找不到,或者按照一定的编码规则进行编解码的时候,按上面图片画红圈圈的地方,同一个数字表示的字符不一样,所以最终显示的时候就乱码了。为了解决这个混乱的局面,咋办呢?

我们已经明白了,因为太多编码导致世界变得过于复杂,于是想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。

这种编码系统就叫做Unicode。Unicode只是一套编码系统,包含所有字符集,却并不规定编码后的二进制代码如何存储。

说通俗一点就是,Unicode包括了全世界各国的所有字符,每个字符都有一一对应好一个独一无二的数字值表示。也就是一一映射好了,一旦人们碰到一个字符就查这个Unicode码表就知道对应的数字值。或者拿到一个数字值就可以对应找到这个字符。如果全世界都按这个码表来定义字符。那全世界的字符都统一起来了,就不会混乱了。但是定义好了全世界统一的一个字符对应的码表(还是开始画的红圈圈那种形式)。

那计算机该如何存储表示呢?也就是前面科普的字符部分,该应用几个字节表示同一个字符(也可等价字符对应的唯一的数字值)呢?用什么规则去表示同一个数字值呢?

 


1.4 由Unicode衍生出来的具体编码规则的编码表

于是由Unicode统一的字符对应的码表,衍生出来了各种细分具体编码规则。utf-32,utf-16,utf-8,gbk,gbk2312等等

 

UTF-32使用4个字节存储每一个字符,但是对于英文字符来说,使用ASCII编码只需1个字节即可存储,这极大的浪费了存储空间。 

因此出现了一种变长的编码方式UTF-8,UTF-8是使用得最广泛的Unicode编码实现方式,使用1-4个字节表示一个字符,根据不同的字符变化长度。比如对于英文字符,1个字节就够了,但是对于中文,可能需要2-4个字节才能存储。

比如:Base64

Base64是网络上最常见的用于传输8Bit字节代码的编码方式,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,可用作简单的加密方式。

1.5 UTF-8

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码(也就是等价于全世界的所有字符都被一个独一无二的数字值表示了,但是这个数字值还需要进一步表示为二进制形式。所以可以理解为字符等价于数字值,数字值等价于对应的二进制形式。所以字符等价于二进制代码),却没有规定这个二进制代码应该如何存储。这里就产生了两个严重的问题:

  1. 计算机要如何区分Unicode编码和ASCII编码呢?
  2. 对英文字母来说,用Unicode编码时,每个字符使用三个、四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过基本不用。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1-4个字节表示一个符号,根据不同的符号而变化字节长度。

ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。说通俗一点就是utf-8可以完全兼容ASCII的编码。所以不用担心ASCII乱码问题,都兼容它。但是同为Unicode编码表衍生出来的utf-32,utf-16,utf-8,gbk,gbk2312,两两之间如果用错了编码,解码表还是会乱码的。

 

 



参考链接:https://www.jianshu.com/p/19c74e76ee0a
               :https://blog.csdn.net/wangtaoking1/article/details/51326754 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值