【Python上手】字符编码

本文内容基于Python 3.x版本进行说明。

# 编码和解码

编码: 目的是让机器读懂语言,比如输入的字符是“中文”,编码以后则变成二进制格式。这样机器就能读懂了。
解码: 与编码相反的过程。

字符串通过编码转换为字节码字节码通过解码转换为字符串
字符串即str,在Python 3.xstr类包含了unicode字符
字节码即bytes,在Python3.x中非unicode编码如UTF-8GBK都被定义成bytes

str--->(encode)--->bytes
bytes--->(decode)--->str

unicode--->(encode)--->UTF8 GBK
UTF8 GBK--->(decode)--->unicode

我们要特别注意字符串编码和解码的字符集是否一致,因为如果两个字符集不一致的时候就会出现乱码。下面是编码转换的一个例子:

c = '中文'  # 这是一个字符串str,unicode
print(type(c), c)  # 输出<class 'str'> 中文

c = c.encode('utf-8')  # 使用UTF-8将str类型编码为bytes类型
print(type(c), c)  # 输出<class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87'

c = c.decode()  # 使用默认方式将bytes类型解码为str类型
print(type(c), c)  # 输出<class 'str'> 中文
# 解决乱码

首先,让我们明确一下可能导致字符串显示乱码的几个原因:

  • Python解释器默认编码
  • 源文件设置的编码
  • 终端编码

如果Python解释器的默认编码与源文件设置的编码不一致,或者终端编码与源文件编码不一致,就会导致乱码。

c = '中国'  # str
c = c.encode('utf-8')  # 采用utf-8编码成bytes类
c = c.decode('gbk')  # 试图采用gbk解码,因编码格式不一,报错如下:

--------------------------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence

Python解释器编码: 指Python内部认为字符串str要转为bytes的默认转换方式,也就是当你使用不带参数的encode()方法时,默认参数。你可以键入以下几行代码得到当前Python解释器编码类型:

import sys

print(sys.getdefaultencoding())  # 我测试了下是utf-8

源文件设置的编码: 如果想要在源码中写非ASCII文字,可以在源码文件开头写入一行:

# coding: utf-8

终端编码: 终端显示的时候,若无法更改终端编码格式的话,需要提前将打印内容转换为终端支持的编码格式。

# 文件读写编码

文件读写时,read()出来的文件内容,得到的就是str类型的,write()写入文件时,也要保证写入类型为str

f = open('test.txt', 'r')
content = f.readlines()  # 得到列表格式的数据
f.close

print(type(content[0]))  # <class 'str'>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值