Python的学习日记——字符转编码操作

时间:2023-01-05 19:06:00

首先搞清楚:Python3的默认编码是unicode,Python2的默认编码是ASCII码

为什么需要编解码?

打个比方:假如说我做了一个游戏,叫《西游记》,游戏传到了日本去。但是日本人的电脑不识别中文,一打开全乱码,所以要进行转换。把中文转换成unicode,然后在转换成为日文。同理中文转换成为日文也要先转换成unicode。

一、Python2的转编码

Python 2 的编解码示意图

Python的学习日记——字符转编码操作

注:上图只适用于python 2

 

几个实例去理解字符的编码问题

实例一:直接编码为unicode看是否能打印

#-*- coding:UTF-8 -*-

s = "你好"
s_to_unicode = s.decode("utf-8")
print(s_to_unicode)

Python的学习日记——字符转编码操作

可以打印:因为unicode就支持中文,并且UTF-8是unicode的扩展集,所以在UTF-8编码下可以直接打印unicode,但是GBK就不行。

实例二:转换成GBK后看是否能打印

#-*- coding:UTF-8 -*-

s = "你好"
s_to_unicode = s.decode("utf-8")
print(s_to_unicode)
print(type(s_to_unicode))
s_to_gbk = s_to_unicode.encode("gbk")
print(s_to_gbk)

 Python的学习日记——字符转编码操作

不可以打印:因为我的xshell终端不支持GBK编码

默认的编码是UTF-8

Python的学习日记——字符转编码操作

修改成默认编码后

Python的学习日记——字符转编码操作

修改后看是否可以打印

Python的学习日记——字符转编码操作

可以打印:因为默认语言就是windows系统编码集(GBK),所以可以打印。此时,上面的unicode没法打印出来(即使unicode可以支持GBK但是必须转码之后才能打印,因为unicode和GBK的编码不是完全一样大的,GBK的“你好”的编码在unicode里对应的不是这两个字)

 实例三:将GBK转回UTF-8

#-*- coding:UTF-8 -*-

s = "你好"
s_to_unicode = s.decode("utf-8")
print(s_to_unicode)
s_to_gbk = s_to_unicode.encode("gbk")
print(s_to_gbk)

gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)

Python的学习日记——字符转编码操作

显然可以打印

实例四:简便的写法

#-*- coding:UTF-8 -*-

s = u"你好"
#u"你好"表示这个字符是unicode编码
#已经是unicode编码的字符不能进行解码,否则会报错
print(s)
s_to_gbk = s.encode("gbk")
print(s_to_gbk)

gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)

二、Python3的转编码

简介:python3会自动转换utf-8、unicode、gbk,并移除了python的unicode类型,并且转码之后不是文字是字节。

自动转换类型的原因:因为python3的数据类型的编码是unicode所以,直接进行encode解码就行了。

#-*- coding:gbk -*-
#这里只是指的文件编码是gbk
import sys
print(sys.getdefaultencoding())
s = "你好"
#这里的是python本身的数据类型,本身是unicode
#print(s.decode)
#因为本身是unicode,所以不能进行decode命令
print(s.encode("gbk"))
print(s.encode("utf-8"))
print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
#因为最后进行了编码,所以显示出来的是字节形式
#要想显示汉字就要decode解码下,decode要说自己是"gb2312"类型
print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))

 Python的学习日记——字符转编码操作

注:从运行结果可以看出,GBK和GB2312的字节码是相同的

因为:GBK向下兼容GB18030,GB18030向下兼容gb2312