写点什么

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

作者:梦想橡皮擦
  • 2022 年 6 月 19 日
  • 本文字数:917 字

    阅读完需:约 3 分钟

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('爬')) # 29228print(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
复制代码


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

发布于: 刚刚阅读数: 4
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
【Python技能树共建】字符编码与解码_Python_梦想橡皮擦_InfoQ写作社区