Python2与Python3的编码区别
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进行转换