unicode 中文英文默认统一 2个字节
ASCII 只有英文和特殊字符 每个占用1个字节 不能存中文
每个字节由8个比特(Bit)构成
假如一个英文文档是2M,转换为unicode 编码转换,就变成了4M
为了解决空间浪费的问题,在unicode的基础上,出现了一个扩展集,叫UTF-8
UTF-8编码是可变长编码。默认所有英文字母按照ASCII的形式去存储。
所有中文字符,统一是3个字节
英文和特殊字符,依然是1个字节
unicode是万国编码,任何国家都可以使用。每个国家,编码都不一样的。
比如一款游戏《大话西游》用的是gbk编码开发的。出口到欧美国家,是无法直接运行的。
怎么办呢?把gbk转换为unicode就可以解决这个问题了。
关于字符编码与转码
请参考详细文章:
http://www.cnblogs.com/luotianshuai/articles/5735051.html
http://www.diveintopython3.net/strings.html
需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
下面请看一张图
将字符串转换为gbk
s = "您好"
print(s.encode("gbk"))
执行输出
b'\xc4\xfa\xba\xc3'
可以看到输出最前面有一个b 表示这是一个二进制类型,也称之为bytes类型
那么encode("gbk"),不光是转换了编码,还转换成了二进制数据
查看gbk和utf-8的区别
import sys
#打印默认编码
print(sys.getdefaultencoding())
s = "您好"
s_gbk = s.encode("gbk")
#打印gbk
print(s_gbk)
#打印utf-8,encode()默认使用utf-8
print(s.encode())
执行输出
utf-8
b'\xc4\xfa\xba\xc3'
b'\xe6\x82\xa8\xe5\xa5\xbd'
将gbk转换为utf-8
import sys
#打印默认编码
print(sys.getdefaultencoding())
s = "您好"
s_gbk = s.encode("gbk")
print(s_gbk)
print(s.encode())
gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8")
print("utf8",gbk_to_utf8)
执行输出
utf-8
b'\xc4\xfa\xba\xc3'
b'\xe6\x82\xa8\xe5\xa5\xbd'
utf8 b'\xe6\x82\xa8\xe5\xa5\xbd'
发现转换之后,和上面的utf-8,是一模一样的。
上面的大图显示
gbk转换为utf8,需要2步
1.首先通过编码【decode】转换为unicode编码
2.然后通过解码【encode】转换为utf-8的编码
总结:
不同编码之间的转换,必须要先转换为unicode编码。
先执行decode()方法,传一个参数,告诉它,我是什么编码。
最后执行encode()方法,传一个参数,将要转换的编码是什么。
以下代码表示,声明文件编码为
# coding: gbk
在python 里面,默认声明的变量是utf-8
# coding: gbk
import sys
#打印默认编码
print(sys.getdefaultencoding())
s = "您好"
s_gbk = s.encode("gbk")
print(s_gbk)
程序执行
utf-8
b'\xc4\xfa\xba\xc3'
如果想要转换的gbk,能够正常显示
需要执行4步
print(s.encode("utf-8").decode("utf-8").encode("gbk").decode("gbk"))
这一段代码就可以正常输出中文
由于s变量,默认就是utf-8编码,不能直接使用decode()方法。
需要先执行encode("utf-8"),再执行decode("utf-8")
再执行encode("gbk"),输出
b'\xc4\xfa\xba\xc3'
由于它是一个bytes类型,需要转换为字符串,所以最后执行decode("gbk")
得到中文 您好
编码之间的转换,需要2个步骤。先decode(),再encode().
转换完成之后,数据是bytes类型的,比较恶心啊。
如果需要正常显示,得decode()一下,才能正常显示。
注意,这里是decode()是指bytes类型与string类型之间的相互转换。