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类型的作用:
    1. 字符存储到硬盘时,需要转成bytes类型
    2. 网络传输的时候,字符要转成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

  1. .encode(self, encoding, errors) 编码:string(encoding) -> bytes(encoding)

  2. .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()
点赞