Python中ASCII码与字符互转的3种方法
在Python编程中,经常需要在字符和其对应的ASCII码值之间来回切换。例如,处理文本编码、生成特定格式的输出、实现简单的加密算法,或者调试时分析字符编码问题。Python提供了多种灵活的方式来完成这项任务。
本文将介绍三种最常用且实用的方法,从基础的内置函数到更底层的字节操作,帮助你应对各种场景。读完后,你可以结合在线ASCII码查询工具验证结果,加深理解。
方法一:使用内置函数 ord() 和 chr()
这是Python中最直接、最常用的方法。两个函数互为反函数,几乎适用于所有ASCII字符互转场景。
ord(char):字符 → ASCII码
ord() 函数接收一个单字符字符串,返回其对应的Unicode码点(对于ASCII字符,即其0-127的整数值)。如果字符串长度大于1,会抛出TypeError。
# 获取字符的ASCII码
print(ord('A')) # 输出: 65
print(ord('@')) # 输出: 64
print(ord('\n')) # 输出: 10 (换行符)
chr(code):ASCII码 → 字符
chr() 是 ord() 的逆操作,接收一个0-1114111(Unicode范围)的整数,返回对应字符。处理ASCII时,通常使用0-127或0-255的值。
# 将ASCII码转换为字符 print(chr(65)) # 输出: A print(chr(36)) # 输出: $ print(chr(169)) # 输出: © (扩展ASCII)
适用场景
-
简单的字符判断与转换,如大小写转换(
chr(ord('a')-32) # 'A')。 -
生成字母表序列(如
[chr(i) for i in range(65, 91)])。 -
实现凯撒密码等基础加密。
优势:代码简洁,易于理解,执行速度快。
注意事项:ord() 需要单个字符,chr() 传入的值必须在有效Unicode范围内。对于标准ASCII(0-127),可以直接使用;对于扩展ASCII(128-255),同样适用,因为Python3的字符串是Unicode。
方法二:通过 bytes 对象与整数相互转换
当处理二进制数据或网络传输时,常需要将字符编码为字节流,或从字节流解码为字符串。bytes 和 bytearray 提供了另一种字符与整数之间的桥梁。
编码与解码
将字符串按指定编码(如 'ascii')转换为 bytes,得到一个不可变字节序列。每个字节值就是0-255的整数。
# 字符串 → 字节 → ASCII码列表
text = "Hello"
byte_seq = text.encode('ascii') # b'Hello'
ascii_list = list(byte_seq) # [72, 101, 108, 108, 111]
print(ascii_list)
# 单个字符
char = 'H'
ascii_val = char.encode('ascii')[0] # 72
print(ascii_val)
反向操作:从整数(或多个整数)构造字节,再解码为字符串。
python
# ASCII码列表 → 字符串
codes = [72, 101, 108, 108, 111] # 对应 "Hello"
byte_seq = bytes(codes)
result = byte_seq.decode('ascii') # "Hello"
print(result)
# 单个整数
single = bytes([65]).decode('ascii') # "A"
适用场景
-
批量处理字符串中所有字符的ASCII码(如用于数据传输)。
-
需要严格确保字符属于ASCII范围(否则会抛出
UnicodeEncodeError)。 -
与二进制数据打交道(如读取文件、网络包)时。
优势:显式处理编码,适合批量操作和二进制数据。
注意事项:encode('ascii') 不能处理非ASCII字符(如中文),会引发异常。若需处理扩展ASCII(128-255),需使用'latin-1'或'cp1252'等编码。
方法三:使用格式化输出或进制转换
有时我们不仅需要十进制数值,还需要十六进制、二进制表示,或者需要使用转义序列。Python的字符串格式化和内置进制转换函数可以满足这些需求。
格式化输出
使用 % 或 str.format() 或 f-string 进行输出。
char = 'A'
code = ord(char)
print(f"字符 '{char}' 的ASCII码: 十进制={code}, 十六进制=0x{code:02X}, 八进制={code:03o}, 二进制={code:08b}")
# 输出: 字符 'A' 的ASCII码: 十进制=65, 十六进制=0x41, 八进制=101, 二进制=01000001
从十六进制/二进制字符串转换
python# 十六进制字符串 → 整数 → 字符 hex_str = "41" char = chr(int(hex_str, 16)) # 'A' print(char) # 二进制字符串 → 整数 → 字符 bin_str = "01000001" char = chr(int(bin_str, 2)) # 'A'
使用转义序列
Python字符串支持\xHH(十六进制)和\OOO(八进制)转义序列,可以直接在代码中表示ASCII字符。
# 十六进制转义
print('\x41') # 输出: A
print('\x0A') # 输出: 换行符
# 八进制转义 (反斜杠后跟最多3位八进制数字)
print('\101') # 输出: A (八进制101=十进制65)
适用场景
-
调试时需要查看字符的多种进制表示。
-
从配置文件或网络协议中读取十六进制/二进制字符串并还原字符。
-
编写需要硬编码控制字符(如
\x00、\x1B)的程序。
优势:灵活,可定制输出格式;支持多进制互转。
注意事项:八进制转义最多3位,且容易与普通字符混淆,建议优先使用\x十六进制。
综合示例:大小写字母互转
结合上述方法,演示如何利用ASCII码值差(大写字母与小写字母相差32)实现大小写翻转。
python
text = "Hello World"
result = []
for ch in text:
if 'A' <= ch <= 'Z':
# 大写转小写:加32
result.append(chr(ord(ch) + 32))
elif 'a' <= ch <= 'z':
# 小写转大写:减32
result.append(chr(ord(ch) - 32))
else:
result.append(ch)
print(''.join(result)) # 输出: hELLO wORLD
你也可以使用在线ASCII码表工具,快速查阅A和a的码值,验证计算结果。
总结
Python提供了丰富的工具进行ASCII码与字符互转:
| 方法 | 核心函数/对象 | 典型场景 |
|---|---|---|
| 基础互转 | ord() / chr() |
单字符处理,逻辑简单 |
| 批量/字节 | encode() / decode() + bytes |
批量操作,严格编码控制 |
| 格式化/进制 | int(str, base) + 格式化字符串 |
多进制展示,配置读取 |
选择哪种方法取决于具体需求。如果你刚接触ASCII编码,建议先从 ord() 和 chr() 入手,同时结合ASCII码查询工具,将代码输出与码表对照,快速建立编码直觉。
现在打开你的Python交互环境,动手试试这些函数吧!