【第6章 字符串】字符身份链与字符串工具对应全解:`ord()`/`chr()`/`encode()`/`decode()`/`chardet.detect()`都是干啥的?
Python中,ord() 和 decode() 有点儿像,区别是什么?
从“都是将某种形式转换为字符相关信息”的角度看,ord() 和 decode() 可能会让人觉得有点“像”,但本质上它们是完全不同的操作,核心区别在于处理的对象和转换的方向。我们可以从“字符身份链”开始理解:
字符身份链与字符串工具对应全解:从字节到字符串的转换利器
在 Python 中,字符的流转可概括为一条“身份链”:二进制字节(bytes)←→ Unicode 码点(整数)←→ 字符串(str)。围绕这条链,ord()/chr()/encode()/decode()/chardet.detect() 各司其职,分别负责不同环节的转换。先通过一张表明确它们的分工:
完整身份链与工具对应关系表
| 工具 | 身份链转换方向 | 核心作用 | 依赖编码规则? |
|---|---|---|---|
decode() |
二进制字节 → Unicode码点 → 字符串 | 解密二进制数据为文字 | 是(必须正确) |
ord() |
字符串 → Unicode码点 | 查询文字的Unicode身份证号 | 否 |
chr() |
Unicode码点 → 字符串 | 用身份证号生成文字 | 否 |
encode() |
字符串 → Unicode码点 → 二进制字节 | 加密文字为二进制数据 | 是(指定规则) |
chardet.detect() |
二进制字节 → 推测编码规则 | 给二进制数据猜“解密密码” | 否(自动推测) |
一、为什么需要这些工具?
字符在计算机中经历“存储→传输→显示”的过程,需要在“人类可读的文字”和“计算机可处理的二进制”之间转换,而 Unicode 码点是二者的“中间枢纽”。例如“中”字的流转:
- 存储/传输时是二进制字节(
b'\xe4\xb8\xad'); - 内存中是 Unicode 码点(20013);
- 显示时是字符串(
"中")。
这5个工具正是为了实现这条链上的“正向/反向转换”而存在,下面逐一详解。
二、工具详解与用法示例
1. decode():从二进制字节到字符串(解密)
作用:沿着身份链从左到右,将二进制字节按编码规则转为字符串(先转码点,再转字符),完成“计算机数据→人类文字”的解密。
示例:
b = b'\xe4\xb8\xad' # 二进制字节(左)
s = b.decode("utf-8") # 用UTF-8规则解密
print(s) # 输出:中(字符串,右)
关键:编码规则必须与字节的生成规则一致(如 UTF-8 字节只能用 UTF-8 解码),否则会乱码。
2. ord():从字符串到 Unicode 码点(查编号)
作用:从身份链右侧的单个字符,查询中间的 Unicode 码点(类似查“身份证号”)。
示例:
s = "中" # 字符串(右)
code = ord(s) # 查询码点
print(code) # 输出:20013(中间的码点)
print(hex(code)) # 输出:0x4e2d(十六进制形式 U+4E2D)
关键:参数必须是单个字符(长度为1的字符串),如ord("中")有效,ord("中国")会报错。
3. chr():从 Unicode 码点到字符串(生成字符)
作用:从身份链中间的码点,生成右侧的字符串字符(ord()的反向操作,类似“用身份证号生成人”)。
示例:
code = 20013 # 码点(中间)
s = chr(code) # 生成字符
print(s) # 输出:中(字符串,右)
扩展:支持所有 Unicode 字符,包括 emoji:chr(128512) → 😀。
4. encode():从字符串到二进制字节(加密)
作用:沿着身份链从右到左,将字符串按编码规则转为二进制字节(先转码点,再转字节),完成“人类文字→计算机数据”的加密。
示例:
s = "中" # 字符串(右)
b_utf8 = s.encode("utf-8") # 用UTF-8规则加密
b_gbk = s.encode("gbk") # 用GBK规则加密
print(b_utf8) # 输出:b'\xe4\xb8\xad'(左,UTF-8格式)
print(b_gbk) # 输出:b'\xd6\xd0'(左,GBK格式)
关键:编码规则决定字节形式(同个字符用不同规则编码,字节结果不同)。
5. chardet.detect():推测二进制字节的编码规则(猜密码)
作用:当不知道二进制字节的编码规则时,自动推测可能的规则(类似“给加密数据猜解密密码”)。
用法:需先安装chardet(pip install chardet):
import chardet
b = b'\xe4\xb8\xad' # 未知编码的字节(左)
result = chardet.detect(b)
print(result) # 输出:{'encoding': 'utf-8', 'confidence': 0.7525}(推测为UTF-8)
注意:结果是推测(置信度非100%),适合处理未知来源的数据(如爬取的网页)。
三、联动示例:完整身份链流转
import chardet
# 1. 字符串 → 码点(ord())
s = "中"
code = ord(s)
print(f"字符串'{s}'的码点:{code}") # 字符串'中'的码点:20013
# 2. 码点 → 字符串(chr())
s2 = chr(code)
print(f"码点{code}对应的字符:{s2}") # 码点20013对应的字符:中
# 3. 字符串 → 字节(encode())
b = s.encode("utf-8")
print(f"字符串'{s}'的UTF-8字节:{b}") # 字符串'中'的UTF-8字节:b'\xe4\xb8\xad'
# 4. 字节 → 推测编码(chardet)
detect = chardet.detect(b)
print(f"字节{b}的推测编码:{detect['encoding']}") # 字节b'\xe4\xb8\xad'的推测编码:utf-8
# 5. 字节 → 字符串(decode())
s3 = b.decode(detect["encoding"])
print(f"字节{b}解码后的字符串:{s3}") # 字节b'\xe4\xb8\xad'解码后的字符串:中
总结
这5个工具围绕“二进制字节←→Unicode码点←→字符串”的身份链,实现了字符在“计算机存储”与“人类阅读”之间的无缝流转:
ord()/chr()处理“字符串与码点”的内部映射(无需编码规则);encode()/decode()处理“字符串与字节”的外部转换(依赖编码规则);chardet.detect()解决“未知字节编码”的痛点(辅助解码)。
掌握它们的分工,就能轻松应对 Python 文本处理的各种场景(文件读写、网络传输、字符分析等)。

浙公网安备 33010602011771号