欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python的编码

程序员文章站 2022-06-29 08:07:59
第一章计算机基础的部分,以后整理完后更新。 2.1 环境安装 + 学习python需要的环境(mac/windows): + 解释器:py2\py3 + 开发工具:pycharm 2.2 编码 2.2.1 编码基础 玩过外国游戏的人经常会遇到安装的软件出现乱码的问题,这其实是因为中文系统的文字编码和 ......

第一章计算机基础的部分,以后整理完后更新。

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()