Python2与Python3编码区别
py3时:
a="中国" 和a=u"中国" 是一个意思,都表示str类型用unicode存储,即默认是unicode存储类型
c=b"中国" 表示str类型bytes存储类型
py2时:
a="中国" 和a=b"中国" 是一个意思,表示str类型bytes存储类型,即默认是bytes存储类型
a=u"中国" 表示str类型unicode存储类型
一、Python文件开始的文件编码类型声明
# -*- coding:utf-8 -*-
#coding:utf-8
用这两种方式可以告诉Python解释器,我是用utf-8编码来保存的文件,你应该用读取utf-8编码的方式来读取我的代码。但是,这和你实际用什么编码来存储你的代码没有直接关系。你这里声明的utf-8但你实际上用GB2312,解释器是不知道的,这里最好一致
二、字符串(str对象)默认编码方式
# demo1
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
# 可以看出默认编码是ASCII
# demo2
reload(sys)
>>> sys.setdefaultencoding('utf-8')
>>> sys.getdefaultencoding()
'utf-8'
# 可以看出默认编码是utf-8
在python中,编码解码其实就是不同编码之间的转换,Unicode就是各种编码之间转换的过渡。
编码就是:unicode→str,
解码就是str→unicode,
在demo2代码执行之后如果执行:
str="我是谁"
str.encode("gb2312")
在其内部实际执行的其实是:
str.decode('utf-8').encode('gb2312')
因为我们已经设置默认编码是utf-8,所以先从utf-8解码到Unicode(上文提到过Unicode是过渡),再从Unicode编码到GB2312。
三、Unicode、utf-8以及gb2312
Unicode给所有可能出现的字符分配了一个编号。
utf-8和gb2312解决了Unicode给字符分配的编号如何存储的问题。对同一个字符不同的编码存储的方式可能不同。所以Unicode是过渡。