Python技能树共建字符编码与解码

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python技能树共建字符编码与解码相关的知识,希望对你有一定的参考价值。

Python 字符编码与解码是什么

在 Python3 中字符默认编码是 Unicode 字符,而编码指的是将字符转换成字节流,解码是相反的操作。

在正式开始前,我们还需要梳理一些基本概念

Python 中的字符串

计算机中 8 比特(bit)等于一个字节(byte),8 比特就是 8 位,即一个字节能表示的最大整数是 255(1111 1111)。

如果希望扩大整数范围,需要用到更多的字节,例如 2 个字节就可以表示 65535,4 个字节就能表示 4294967295。

基于上述原理出现了各种编码格式,例如 ASCII 可以表示 256 个字符,但仅支持英文字母,数字和少部分符号,中文的范围要大很多,所以出现了 GB2312 编码(后来升级到了 GBK 编码),可以容纳 6763 个汉字,但放眼世界还不够,还需要更多的字符。

此时 Unicode 字符集就出现了,它将所有的语言都容纳在一起,后续为了在存储和传输数据时节省空间,出现了 UTF8 编码。

怎么用

Python 编码基本使用

通过 ord() 函数获取字符的整数表示,通过 chr() 将整数转换为字符,例如下述代码

print(ord('爬')) # 29228
print(chr(29228))

既然知道数字可以转换为数字,那十进制和十六进制的数字都可以。

例如 29228 = 722c,所以 \\u722c

print(chr(int('722c', 16)))

也可以使用 Unicode 转码工具进行转换。

Python 编码和解码函数

encode()decode() 分别对应编码和解码函数,en 是编码,de 是解码。

my_b = '技能树'.encode('utf-8')
print('编码后',my_b) # 编码后 b'\\xe6\\x8a\\x80\\xe8\\x83\\xbd\\xe6\\xa0\\x91'

解码操作如下所示:

my_b = '技能树'.encode('utf-8')
print('编码后', my_b)  # 编码后 b'\\xe6\\x8a\\x80\\xe8\\x83\\xbd\\xe6\\xa0\\x91'

my_str = my_b.decode('utf-8')
print("解码后", my_str)

需要注意编码后输出的内容与字符串类似,就是前面有一个前缀 b

乱码

如果编码和解码方法不一致,就会出现乱码问题,例如下述代码

my_b = '技能树'.encode('gbk')
print('编码后', my_b)  # 编码后 b'\\xbc\\xbc\\xc4\\xdc\\xca\\xf7'

my_str = my_b.decode('utf-8')
print("解码后", my_str)

出错信息如下所示:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 0: invalid start byte

当出现上述类型的错误时,需要做的就是寻找到正确的原编码,然后进行处理。

以上是关于Python技能树共建字符编码与解码的主要内容,如果未能解决你的问题,请参考以下文章

Python技能树共建python urllib 模块

Python技能树共建Python爬虫模拟登录

Python技能树共建Python爬虫模拟登录

技能树共建Python requests 模块

Python技能树共建lambda 表达式

Python技能树共建常用标准库