chr() 和 ord() 是互逆函数,chr() 将 0–1114111 范围内的整数转为 Unicode 字符,ord() 将单个字符转为其 Unicode 码点;二者不支持多字符或越界输入。

chr() 和 ord() 是什么关系
它们是一对互逆函数,专门处理单个字符和对应整数编码之间的转换。不是万能编码工具,只管 ASCII 和 Unicode 基本平面里单个码点——chr() 输入数字返回字符,ord() 输入字符返回数字。
常见错误现象:ord('ab') 报 TypeError: ord() expected a character, but string of length 2 found;chr(1000000) 报 ValueError: chr() arg not in range(0x110000)。
-
ord()只接受长度为 1 的字符串,不能传入空字符串或多个字符 -
chr()参数必须是 0–0x10FFFF(即 0–1114111)之间的整数 - Python 3 中默认按 Unicode 处理,不是“只支持 ASCII”——比如
ord('€')返回 8364,chr(128512)返回 ?
怎么安全地把字符串转成 ASCII 码列表
别直接对整个字符串调 ord(),它不支持。得用循环或推导式逐个处理每个字符。
使用场景:调试协议字段、做简单编码/解码、校验输入是否全为 ASCII 字符。
立即学习“Python免费学习笔记(深入)”;
- 要获取 ASCII 码列表:
[ord(c) for c in 'hello']→[104, 101, 108, 108, 111] - 想过滤非 ASCII 字符再转码:
[ord(c) for c in 'café' if ord(c) → <code>[99, 97, 102, 101](去掉了 é) - 注意:中文、emoji 等都会返回大于 127 的值,不是错误,是正常 Unicode 码位
为什么 chr(ord(x)) 不一定等于 x
绝大多数情况下相等,但有两个例外场景容易被忽略。
参数差异和兼容性影响:主要出在代理对(surrogate pairs)和某些组合字符上。
- 在 Python 内部,如果字符串含 UTF-16 代理对(如某些罕见增补字符),
ord()仍能返回合法码点,chr()也能还原,但该字符可能在部分终端或字体中无法显示 - 组合字符(如带重音的字母)可能由基础字符 + 组合符构成,
ord()只作用于单个 Unicode 码点,不会自动归一化——'é'可以是 U+00E9 单个字符,也可以是'e' + '\u0301'两个码点,这时ord()行为完全取决于你传进去的是哪一个 - 所以严格来说,
chr(ord(x)) == x成立的前提是x是长度为 1 的规范 Unicode 字符(non-surrogate, non-combining)
性能和边界值要注意什么
这两个函数本身极快,但滥用会引入隐性开销或逻辑漏洞。
常见错误现象:用 chr() 拼接大量字符代替字符串乘法,或拿 ord() 判断字母大小写却没考虑 locale。
- 不要用
''.join(chr(n) for n in [97,98,99])替代'abc'——无意义且慢 - 判断 ASCII 字母推荐用
c.isalpha()或'a' ,别用 <code>97 ,后者不处理大写、不跨平台、易写错范围 -
ord('\0')是 0,chr(0)是空字符,写入文件或传给 C 扩展时可能被截断,需特别留意
最常被跳过的其实是字符长度检查和 Unicode 归一化——传给 ord() 前最好先确认 len(s) == 1,处理用户输入时建议先用 unicodedata.normalize('NFC', s)。










