摘要:在 Python 中,字符串与对象的可打印表示通常通过 repr 获取。然而,当字符串中含有非 ASCII 字符时,repr 可能会原样输出这些字符。为了在仅支持 ASCII 的环境中安全显示,Python 提供了内置函数 ascii,它会将对象的非 ASCI
在 Python 中,字符串与对象的可打印表示通常通过 repr 获取。然而,当字符串中含有非 ASCII 字符时,repr 可能会原样输出这些字符。为了在仅支持 ASCII 的环境中安全显示,Python 提供了内置函数 ascii,它会将对象的非 ASCII 字符转义为对应的 \x、\u 或 \U 序列。
一、函数语法
ascii(object)参数:
object:任意 Python 对象。
返回值:
返回对象的字符串表示形式(类似 repr),但所有非 ASCII 字符会转义。返回值类型始终为 str。
二、基础用法示例
1、普通字符串
print(ascii("Hello")) # 'Hello'2、包含中文
print(ascii("你好")) # '\u4f60\u597d'3、混合字符
print(ascii("Python")) # 'Python\U0001f40d'4、列表与字典
data = ["A", "北京", {"key": "值"}]print(ascii(data))# ['A', '\u5317\u4eac', {'key': '\u503c'}]三、进阶技巧
1、与 repr 的区别
s = "你好"print(repr(s)) # '你好'print(ascii(s)) # '\u4f60\u597d'repr 保留原始字符(可能是非 ASCII)。
ascii 保证输出只包含 ASCII。
2、转义序列解码
像 \x、\u 或 \U 这样的转义序列,如果转换回原来的字符串,可以用字符串的 .encode.decode 方法配合 unicode_escape 编解码器。
方法一:直接解码 ascii 的返回值
s = ascii("汉");print(s) # '\u6c49'# 转换为真正的汉字decoded = s.encode('utf-8').decode('unicode_escape')print(decoded) # 汉.encode('utf-8') 先把这个字符串编码成字节串。.decode('unicode_escape') 按 Unicode 转义规则把 \u6c49 翻译为真实字符。
方法二:解码原始转义序列字符串
s = r"\u6c49" # 原始字符串,内容是 \u6c49decoded = s.encode("utf-8").decode("unicode_escape")print(decoded) # 汉四、ascii 的特点
1、保证可打印
结果只包含 ASCII 范围内的字符。
2、适用于任意对象
对容器(如列表、字典)也会递归转义其中的元素。
3、与 repr 相似但更安全
ascii ≈ repr + “非 ASCII 转义”。
五、补充说明
1、常见误区
print(ascii(123)) # '123' ✅ 数字不会转义ascii 不仅能处理字符串,也能作用于任意对象(包括列表、字典等)。
2、转义序列的含义
当对象中包含非 ASCII 字符时,ascii 会自动将它们转义为标准的 Unicode 转义形式:
\xhh :表示一个字节(两位十六进制,范围 00–ff),常用于 Latin-1 范围内的字符。
\uXXXX :表示一个 16 位的 Unicode 码点(四位十六进制,范围 U+0000–U+FFFF)。
\UXXXXXXXX :表示一个 32 位的 Unicode 码点(八位十六进制,范围 U+00000000–U+10FFFF)。
示例:
print(ascii("ñ")) # '\xf1' (Latin-1 范围,用 \x 表示)print(ascii("汉")) # '\u6c49' (BMP 范围,用 \u 表示)print(ascii("")) # '\U0001f40d' (超出 BMP,用 \U 表示)3、应用场景
(1)在日志和调试中生成 ASCII 安全的输出,避免控制台编码错误。
(2)在网络传输或跨平台文件保存时,确保数据只包含 ASCII 字符。
(3)在国际化环境中避免编码问题。
小结
ascii 是 Python 提供的一个实用函数,它与 repr 类似,但会确保输出中没有非 ASCII 字符,而是使用转义序列代替。这使得它在日志记录、跨平台输出、调试以及编码受限环境下尤其有用。通过配合 unicode_escape,还可以将转义序列还原为原始字符,实现编码与解码的灵活转换。
“点赞有美意,赞赏是鼓励”
来源:真来教育