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

举报
梦想橡皮擦 发表于 2022/05/23 17:50:42 2022/05/23
【摘要】 Python 字符编码与解码是什么在 Python3 中字符默认编码是 Unicode 字符,而编码指的是将字符转换成字节流,解码是相反的操作。在正式开始前,我们还需要梳理一些基本概念Python 中的字符串计算机中 8 比特(bit)等于一个字节(byte),8 比特就是 8 位,即一个字节能表示的最大整数是 255(1111 1111)。如果希望扩大整数范围,需要用到更多的字节,例如 ...

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

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。