Python - 标准库 - ascii() 函数

5
我已经开始查阅 Python 标准库: (http://docs.python.org/3/library/functions.html),旨在进一步熟悉基本的 Python。 但是,在解释 ascii() 函数时,我并没有找到很清晰的说明。
请问有哪位能够提供简明扼要的解释,同时附上使用 ascii() 函数的有用示例呢? 该函数的使用场景是什么?
2个回答

6

ascii()是一个函数,它将repr()的输出进行编码,对于由repr()产生的输出中不在ASCII范围内的任何代码点使用转义序列。

因此,像ë这样的Latin 1代码点被表示为Python转义序列\xeb

这是Python 2中的标准表示方法;Python 3的repr()将大多数Unicode代码点保留为其实际值输出,只要它是可打印字符:

>>> print(repr('ë'))
'ë'
>>> print(ascii('ë'))
'\xeb'

两种输出都是有效的Python字符串字面量,但后者仅使用ASCII字符,而前者需要使用Unicode兼容编码。
对于U+0100和U+FFFF之间的unicode代码点,使用\uxxxx转义代码序列;对于超过此范围的任何内容,使用\Uxxxxxxxx形式。有关Python字符串字面量的可用转义代码语法,请参见可用的转义代码语法
与repr()类似,ascii()是一个非常有用的调试工具,特别是在处理字符串的确切内容时。与repr()不同,ascii()输出使许多Unicode陷阱更加明显。
例如,考虑非规范化的代码点;字符ë可以用两种方式表示,作为U+00EB代码点或作为ASCII e加组合分隔符¨(代码点U+0308):
>>> import unicodedata
>>> one, two = 'ë', unicodedata.normalize('NFD', 'ë')
>>> print(one, two)
ë ë
>>> print(repr(one), repr(two))
'ë' 'ë'
>>> print(ascii(one), ascii(two))
'\xeb' 'e\u0308'

只有使用ascii(),才能清楚地看到two由两个不同的码点组成。


我想补充的是\x\u\U一样,引用Unicode中的“代码点”。而且从技术上来说,据我所知,two包含两个“代码点”,而不是字符(Unicode称之为单个用户可感知的字符)对吧? - Eric O. Lebigot
1
@EOL:是的,我在这里有点过于随意地使用了字符和代码点。我已经更新了帖子。 - Martijn Pieters
谢谢。还有一点:我不是完全的专家,但是“因此,像ë这样的Latin 1代码点由Python转义序列\xeb表示”应该是我认为“因此,像ë这样的Latin 1 字符_由Python转义序列\xeb表示(因为ë在十六进制中具有Unicode代码点EB)_。”,对吧? - Eric O. Lebigot
它仍然是一个代码点(编号为U+00EB),而不是由“e”和组合分音符组成的分解形式。 - Martijn Pieters

1

ascii() 可以帮助查看字符串中的确切内容。如果一个字符串包含空格或不可打印字符,或者终端因为字符编码不匹配而将字符串转换成 乱码,查看 ascii 表示可以提供一个可见且明确的表示方式,使得那些否则无法阅读的字符在所有终端上都能以相同的方式打印。

在 Stackoverflow 上经常会有关于字符串错误打印的问题,有时很难确定发生了什么,因为问题只显示了乱码,而没有提供一个明确的字符串表示方式。当提问者展示了 ascii 表示(或 Python 2 中的 repr)时,情况就变得更加清晰了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接