在Python编程中,经常需要在字符和其对应的ASCII码值之间来回切换。例如,处理文本编码、生成特定格式的输出、实现简单的加密算法,或者调试时分析字符编码问题。Python提供了多种灵活的方式来完成这项任务。

本文将介绍三种最常用且实用的方法,从基础的内置函数到更底层的字节操作,帮助你应对各种场景。读完后,你可以结合在线ASCII码查询工具验证结果,加深理解。

方法一:使用内置函数 ord() 和 chr()

这是Python中最直接、最常用的方法。两个函数互为反函数,几乎适用于所有ASCII字符互转场景。

ord(char):字符 → ASCII码

ord() 函数接收一个单字符字符串,返回其对应的Unicode码点(对于ASCII字符,即其0-127的整数值)。如果字符串长度大于1,会抛出TypeError

python
# 获取字符的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的值。

python
# 将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的整数。

python
# 字符串 → 字节 → 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 进行输出。

python
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字符。

python
# 十六进制转义
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码表工具,快速查阅Aa的码值,验证计算结果。

总结

Python提供了丰富的工具进行ASCII码与字符互转:

方法 核心函数/对象 典型场景
基础互转 ord() / chr() 单字符处理,逻辑简单
批量/字节 encode() / decode() + bytes 批量操作,严格编码控制
格式化/进制 int(str, base) + 格式化字符串 多进制展示,配置读取

选择哪种方法取决于具体需求。如果你刚接触ASCII编码,建议先从 ord() 和 chr() 入手,同时结合ASCII码查询工具,将代码输出与码表对照,快速建立编码直觉。

现在打开你的Python交互环境,动手试试这些函数吧!