首先,介绍一下编码类型:
然后,再看一下编码类型的转换过程:
python程序是在内存中运行,因此应该处理的是Unicode类型的字符串,文件或终端中的各种编码方式,可以理解为py3中的Bytes类型。
Unicode只能在内存中使用
Bytes是在文件存储和网络数据传输中使用
记住我们的程序要处理的是Unicode类型
下面看一下py2和py3中字符串的类型:
py2:
py3:
看起来好像一样,都是str类型,其实对应的编码方式是不一样的,请看下图:
这样是否看出区别了呢?在py3中,str就是Unicode类型,所以py3中不会有中文编码的各种问题,声明一个str类型的中文字符串,程序即可直接进行处理;但是在py2中呢,str是对应的gbk、utf-8等类型,相当于编码后的Unicode,程序要处理的是Unicode类型,而你的中文字符串是gbk类型(随便选一个举例),这样程序自然就报错了。
py3:
s = “abc” #等价于py2的unicode类型,例如s=u"中国"
type(s) —str类型—>> unicode
s1=b"abc" —bytes类型—(gbk,utf-8…)
s.encode(“utf-8”)—>bytes类型
s.encode(“utf-8”).decode(“utf-8”)—>unicode类型
py2:
s = “中国” #等价于 py3的bytes类型
type(s) —str类型—>不是unicode,而是类似py3里面的bytes对象
s.decode(“utf-8”)—>unicode
s.decode(“utf-8”).encode(“utf-8”)类型—>str类型
这样看是否就很清晰了呢?也就是说你在py3中声明一个str类型变量,这个变量支持的操作是编码操作,即s.encode(“utf-8”);
而你在py2中声明一个str类型变量,这个变量支持的操作是解码操作,即s.decode(“utf-8”)
那么,有中文的情况下应该怎么使用才不会报错呢?
py2:
1 文件要存为utf-8
2 文件第一行声明为(下面这几种都可以,随便选一种):
#encoding=utf-8
#coding=utf-8
#coding:utf-8
#
coding:UTF-8
3 所有的中文前面加u,表示unicode
py3:
1 文件要存为utf-8
2 声明可以不加,加上也没问题
3 中文前面不用加u,加了也没事
常用终端的编码类型:
CMD是gbk编码
记事本默认ANSI编码(gbk)
注:
1.读文件 读到的都是Unicode
2.编码和解码要用相同的字符集(用什么编码就用什么解码)