Python2与Python3的编码区别

来源:互联网 发布:java中的红黑树 编辑:程序博客网 时间:2024/05/21 18:00

1. str和bytes

1.1 str是文本,bytes是字节

文本是有编码的(UTF-8,GBK,GB2312等)
字节没有编码

文本的编码指的是字符如何使用字节来表示组织方式,linux下默认都使用UTF-8
通过b前缀可以定义bytes

2. Python2和Python3的编码

2.1 Python2

在python2 中是不区分bytes和str类型的,在python3中bytes和str中是区分的,str的所有操作bytes都支持

  • python2
    这里写图片描述

  • python3
    这里写图片描述

除了encode外,str操作都有对应的bytes版本,但是传入的参数必须是bytes

2.2 Python3

2.2.1 bytes与str之间的转换——-编码

bytes由str通过encode方法转化得到的
str也可以通过bytes 通过decode方法转化得到

GBK 是双字节,UTF-8 灵活编码,1字节,2字节,3字节,4字节都有,最大支持6字节长度,中文大多数是3字节

简单来讲:
py3中,str就相当于java中的tostring()方法

这里写图片描述

当一段字符以不同的形式编码后,所对应的字节是不一样的
比如:
这里写图片描述

1. encode转化后的字节流bytes是不是字符串?

bytes不是字符串str。在python3中,bytes是字节流bytes对象,字符串是字符串str对象。

2. 同样是对字符串进行encode(),为什么有的结果是字母,而有的是十六进制\x

这里写图片描述

编码的实际作用就是把一个字符串转化为编码对应的字节形式.

注意:在运行界面输出bytes时候,它是采取这样的原则的:每读一个字节就和ascii码比对一下,如果符合ascii码的可显示字符(特殊字符,字母和数字,控制字符除外),那这个字节就按照ascii码来表示,否则就按十六进制\x某某来表示。

比如“abc中国”进行utf-8编码后(encode()默认以utf-8形式),得到的字节如下:
这里写图片描述

当在界面输出bytes的时候,会依次读取每一个字节,并与ASCII编码进行比较。因为前三个字节正好在ASCII编码表中能够查到,所以直接显示其对应的字符。
这里写图片描述

对于汉字“中”的字节十六进制字节E4B8AD中的第一个字节E4,对应的十进制是228,不在ASCII编码范围内,所以在界面输出时,直接输出十六进制

3. 那如何定义bytes变量呢?

直接用b’字符串’表示bytes对象,字符串形式可以是ASCII范围内的字符,也可以说十六进制字符串,但不能是中文

这里写图片描述

同样,在界面输出时,它会将每个字符依次在ASCII中进行查找。

4. 英文编码和中文编码的区别

这里写图片描述

5. Python程序编辑界面的unicode码u’a’是字符串还是字节码?unicode码又怎么表示?

u ‘a’ 不是字节码,是字符串。也就是说,在Python3中,u ‘a’就是str对象
这里写图片描述

下图中的表达,第一个”\u”表示Unicode编码,第二个”\”是一个反义字符
这里写图片描述

6. 如果它表示字符串,那怎么转化为unicode码?用encode指定unicode方式?

这里写图片描述

7. len()

bytes和str对象除了decode()和encode()方法不同外,其他str有的方法bytes一般都有

这里写图片描述

2.2 使用utf-8进行转换

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换

参考
http://www.jianshu.com/p/6cbb2b14cda9