目录python
1.编码的历史python3.x
2.python 3.x中的bytes与stride
3.编码的转换函数
正文开始编码
1.编码的历史与发展spa
1.1编码历史变动code
编码能够理解为谍战片中电报的密码本,若是要想让电脑识别要输入的文本,须要将文本转换为电脑能识别的机器语言blog
因为发明计算机的是美国人,因此最开始的编码表就是美国人所设定,所设定的这个表就为ASCII码,ASCII码包含字母大小写、数字以及特殊符号。ASCII码使用8bit,一个字节表达一个字符,因此作多显示为2**8-1个字符,也就是255个字符,例如00000001 autf-8
后面因为计算机的普遍传播,ASCII码已经彻底不能知足人们的平常须要,这个时候就出现了万国码,unicode,使用16bit,2个字节表示一个字符,后面使用后发现并不能实现,这个时候就进行了升级,此时采用32bit,也就是四个字节表示一个字符,虽然基本包含了全部的字符,可是,使用这种编码占用空间就很大;最终在后期的升级下,采用了如今大范围使用的UTF-8编码格式,对于英文以及传统的特殊字符采用ASCII编码,也就是8bit,一个字节,对于欧洲地区采用16bit,也就是2字节表示一个字符,对于亚洲区域则采用24bit,也就是三个字节显示一个字符。unicode
过于国内的字符编码,在unicode和utf-8没有大规模使用的期间,我国有本身的一套独立的编码格式,由最开始的GB2312到后面的GBK在到最新的GB18130,对于国内的编码的格式主要是,英文等传统特殊符号采用ASCII码就行,对于中文则采用16bit,也就是2字节表示,这样就形成不一样国家不一样的字符规格。
实例
'old男孩'在GBK中是7字节,在utf-8是9字节
在python 2.7版本中,默认为ASCII码,不支持中文,若是须要输入中文必须在文首输入如下
# -*- encoding:utf-8 -*-
1.2进制的区别
进制主要有二进制,八进制,十进制,十六进制
二进制:只有01
八进制:0-7
十进制:0-9
十六进制:0-E
1.2.1二进制转十进制以及十进制转换二进制
二进制转化成十进制 1101 ---> 0*2**7+0*2**6+1*2**5+0*2**4+1*2**3+1*2**2+0*2**1+1*2**0 1*2**5+1*2**3+1*2**2+1*2**0 = 32 + 8 + 4 + 1 = 45 十进制转化成二进制 : 对2取余,逆向排列 ——-> 0010 1010
2.python3.x中的bytes与str
回到bytes
和str
的身上。bytes
是一种比特流,它的存在形式是01010001110这种。咱们不管是在写代码,仍是阅读文章的过程当中,确定不会有人直接阅读这种比特流,它必须有一个编码方式,使得它变成有意义的比特流,而不是一堆晦涩难懂的01组合。由于编码方式的不一样,对这个比特流的解读也会不一样,对实际使用形成了很大的困扰。下面让咱们看看Python是如何处理这一系列编码问题的:
>>> s = "中文" >>> s '中文' >>> type(s) <class 'str'> >>> b = bytes(s, encoding='utf-8') >>> b b'\xe4\xb8\xad\xe6\x96\x87' >>> type(b) <class 'bytes'>
从例子能够看出,s
是个字符串类型。Python有个内置函数bytes()
能够将字符串str
类型转换成bytes
类型,b
其实是一串01的组合,但为了在ide环境中让咱们相对直观的观察,它被表现成了b'\xe4\xb8\xad\xe6\x96\x87'
这种形式,开头的b
表示这是一个bytes
类型。\xe4
是十六进制的表示方式,它占用1个字节的长度,所以”中文“被编码成utf-8
后,咱们能够数得出一共用了6个字节,每一个汉字占用3个,这印证了上面的论述。在使用内置函数bytes()
的时候,必须明确encoding
的参数,不可省略。
咱们都知道,字符串类str
里有一个encode()
方法,它是从字符串向比特流的编码过程。而bytes
类型刚好有个decode()
方法,它是从比特流向字符串解码的过程。除此以外,咱们查看Python源码会发现bytes
和str
拥有几乎如出一辙的方法列表,最大的区别就是encode
和decode
。
从实质上来讲,字符串在磁盘上的保存形式也是01的组合,也须要编码解码。
若是,上面的阐述还不能让你搞清楚二者的区别,那么记住下面两几句话:
在将字符串存入磁盘和从磁盘读取字符串的过程当中,Python自动地帮你完成了编码和解码的工做,你不须要关心它的过程。
使用bytes
类型,实质上是告诉Python,不须要它帮你自动地完成编码和解码的工做,而是用户本身手动进行,并指定编码格式。
Python已经严格区分了bytes
和str
两种数据类型,你不能在须要bytes
类型参数的时候使用str
参数,反之亦然。这点在读写磁盘文件时容易碰到。
在bytes和str的互相转换过程当中,实际就是编码解码的过程,必须显式地指定编码格式。
3.编码的转换
对于编码的转换,只须要记住下面这个图就行了