Python的编码
第一章计算机基础的部分,以后整理完后更新。
2.1 环境安装
- 学习python需要的环境(mac/windows):
- 解释器:py2\py3
- 开发工具:pycharm
2.2 编码
2.2.1 编码基础
玩过外国游戏的人经常会遇到安装的软件出现乱码的问题,这其实是因为中文系统的文字编码和外国文字编码不同而导致的。
电脑中的文字编码有很多种,我们常见的有下面几种。
- 常见编码:
- ascii (英语)
- unicode (内存中使用的编码,可以支持世界上任何语言符号。又称:万国码。由联合国组织定义)
- cse2 (以前常用的编码形式)
- cse4 (常用的编码形式)
- gbk (中文编码的一种,现在广泛被使用)
- gb2312 (中文编码的一种,比较旧的编码)
- utf
- utf-8 (unicode码用于网络传输或保存硬盘时候使用的编码,最常用)
- utf-16 (占用16bit的utf)
- utf-32 (占用32bit的utf)
- shift-jis (日语编码)
中文字符1个字符在utf-8中占3字节,在gbk中占2字节
2.2.2 python编码相关
我们的python解释器有自己默认的编码。
- python解释器的默认编码:
- py2:ascii
- py3:utf-8
如果想要修改默认编码,可以在代码开始行写入:
# -*- coding:utf-8 -*- #
注意:对于操作文件,要按照:以什么编码写入,就要用什么编码去打开
2.2.3 扩展:bytes类型
首先我们介绍下硬盘存储数据的方式:
硬盘只能存储2进制数据。
所以数据网硬盘上存储,就要以相应的编码转成2进制后存储
把数据网硬盘存储,就要以相应的编码转成2进制后存储:
- 文字 : utf-8/gbk --> 2进制
- 图片 : jpg/png --> 2进制
- 音乐 : mp3/wav --> 2进制
- 视频 : mp4/avi --> 2进制
1. bytes类型
bytes类型:以16进制形式表示,2个16进制数构成一个byte,以 b''来标识的字节串
需要注意的是,文件处理的open() 函数会默认自动转换2进制(bytes型)进行处理(读取时decode,存储时encode)。所以open命令也是在2进制的基础上进行存储的。
- bytes类型的作用:
- 字符存储到硬盘时,需要转成bytes类型
- 网络传输的时候,字符要转成bytes传输
2. 编码: encode
- .encode(self, encoding, errors) 用encoding的编码格式转换成bytes类型,并返回
s = '字符串' s_2 = s.encode('utf-8') # 把utf-8的字符串编码成utf-8的bytes类型,并返回 print(s_2) # 输出 b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2' # 这里\xe5 中'x'表示这是16进制,e5是2个16进制数,正好是8bit(1byte),表示一个字节。 # 这里一共9个字节(utf-8的一个中文占3个字节) s_2 = s1 = s.encode('gbk') # 把gbk的字符串编码成gbk的bytes类型,并返回 print(s_2) # 输出 b'\xd7\xd6\xb7\xfb\xb4\xae' # 这里一共6个字节(utf-8的一个中文占2个字节)
utf-8编码每个中文3字节,gbk编码每个中文2字节。但是utf-8与国际通用
3. 文件操作与bytes类型
文件处理的open() 函数会默认自动转换2进制(bytes型)进行处理(读取时decode,存储时encode)。 所以open()打开文件后不需要进行转换处理。
# f = open('windata.txt','r') # r(文本模式),把2进制自动解码成str(unicode) 。所以读取了硬盘文件可以是str
如果我们不想让open()自动转换,那么我们可以以 wb,rb,ab 的模式打开:
b: binary (2进制)
f = open('test.txt','wb') # 注意:2进制模式不能使用encoding关键字 f.write('字符串'.encode('utf-8')) # 把utf-8的字符串编码成utf-8的bytes类型,并写入。 # f.write('字符串') # 这个会报错,str不能直接写入b模式打开的文件,所以会报错。
2.2.4 编码与解码 encode,decode
.encode(self, encoding, errors) 编码:string(encoding) -> bytes(encoding)
.decode(self, encoding, errors) 解码:bytes(encoding) -> string(unicode)
s = '编码和解码' s1 = s.encode('utf-8') # 把utf-8的字符串编码成utf-8的bytes类型 print(s1) s2 = s1.decode('utf-8') # 把utf-8码的bytes类型解码成unicode码的字符串。默认是转utf-8,建议写明。 print(s2)
2.2.5 编码的转换
把文字从一种编码转化成另外一种。一般用(b模式处理)
为什么要进行编码转换?
比如:
windows(中文)创建的文件是默认gbk编码
linux/mac创建的文件是默认utf-8编码
当一个windows文件在linux系统上读取的时候,因为编码不同会显示乱码
那么如何转换呢?
- 可以通过unicode:
- 万国码
- 跟所有的编码之间,有映射关系
例:gbk --> unicode --> utf-8
f = open('windata.txt','rb') # 以rb模式打开windows的文件,这里假设编码是gbk。 s = f.read() # 读取bytes数据 s_unicode = s.decode('gbk') # 把gbk码的s解码成unicode,并且赋值给s_unicode s_utf8 = s_unicode.encode('utf-8') # 把unicode编码成utf-8,并且赋值给s_utf8 f.close() f = open('windata.txt','wb') # 以wb模式打开文件 f.write(s_utf8) # 把utf-8码的bytes数据写入文件 f.close()