ZetCode

Python ascii 函数

上次修改时间:2025 年 4 月 11 日

这份全面的指南探讨了 Python 的 ascii 函数,该函数返回一个包含对象可打印表示形式的字符串。我们将介绍字符串转换、非 ASCII 处理以及 ASCII 转义序列的实际示例。

基本定义

ascii 函数返回一个包含对象可打印表示形式的字符串,其中非 ASCII 字符会被转义。它的工作方式与 repr 类似,但会转义非 ASCII 字符。

主要特征:将任何对象转换为其 ASCII 表示形式,使用 \x、\u 或 \U 转义符转义非 ASCII 字符,并且始终返回一个字符串。它对于调试和序列化非常有用。

基本字符串转换

这是一个简单的用法,展示了 ascii 如何以不同于 reprstr 的方式处理 ASCII 和非 ASCII 字符串。

basic_ascii.py
# ASCII string
print(ascii("hello"))      # 'hello'

# Non-ASCII string
print(ascii("héllö"))      # 'h\xe9ll\xf6'

# Comparison with repr
print(repr("héllö"))       # 'héllö'
print(str("héllö"))        # héllö

此示例显示 ascii 将字符串转换为仅 ASCII 表示形式。非 ASCII 字符使用 \x 序列转义。

repr 的区别很明显 - repr 保留原始字符,而 ascii 转义它们。

非 ASCII 字符处理

此示例演示了 ascii 如何处理来自不同 Unicode 范围的各种非 ASCII 字符。

non_ascii.py
# Latin-1 Supplement (é)
print(ascii("café"))       # 'caf\xe9'

# Greek (π)
print(ascii("πr²"))        # '\u03c0r\xb2'

# Emoji (😊)
print(ascii("Hello 😊"))   # 'Hello \U0001f60a'

# Chinese (你好)
print(ascii("你好"))       # '\u4f60\u597d'

该函数根据字符的 Unicode 代码点以不同的方式转义字符。Latin-1 使用 \x,BMP 使用 \u,更高的平面使用 \U。

此行为确保输出字符串仅包含 ASCII 字符,同时通过转义序列保留所有信息。

带有 __repr__ 的自定义对象

ascii 通过调用其 __repr__ 方法然后转义结果来处理自定义对象。此示例显示了该行为。

custom_ascii.py
class Person:
    def __init__(self, name):
        self.name = name
    
    def __repr__(self):
        return f"Person({self.name})"

p1 = Person("Alice")
p2 = Person("Álice")

print(ascii(p1))  # 'Person(Alice)'
print(ascii(p2))  # 'Person(\xc1lice)'

Person 类实现了 __repr__。当我们调用实例上的 ascii 时,它首先获取表示字符串,然后转义非 ASCII。

这显示了如何在维护仅 ASCII 输出的同时将 ascii 与自定义对象一起使用。

容器类型

当与列表或字典等容器一起使用时,ascii 会转义所有包含元素中的非 ASCII 字符。

containers.py
data = [
    "café",
    {"key": "välue"},
    (1, "π"),
    {"α", "β"}
]

print(ascii(data))
# ['caf\xe9', {'key': 'v\xe4lue'}, (1, '\u03c0'), {'\u03b1', '\u03b2'}]

该示例显示 ascii 递归处理容器元素。如果每个字符串元素包含非 ASCII 字符,则会被转义。

当您需要序列化数据同时确保 ASCII 输出时(例如,对于某些网络协议),此行为很有用。

错误处理

ascii 函数不会因任何输入类型而引发错误,因为它依赖于对象的 __repr__ 方法。

errors.py
class BadRepr:
    def __repr__(self):
        return "Bad: café"

print(ascii(BadRepr()))  # 'Bad: caf\xe9'

print(ascii(123))       # '123'
print(ascii([1, 2, 3])) # '[1, 2, 3]'
print(ascii(None))      # 'None'

这些示例演示了 ascii 在不同类型上的行为。它首先获取字符串表示形式,然后转义非 ASCII 字符。

即使使用返回非 ASCII 的自定义 __repr__ascii 也会在最终输出中转义这些字符。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程