【发布时间】:2014-03-09 05:54:05
【问题描述】:
我已经开始浏览Python标准库了:(http://docs.python.org/3/library/functions.html)
试图进一步熟悉基本的python。关于ascii()函数的解释,我看的不是很清楚。
是否有人能够提供一个简明的解释,举例说明可以使用 ascii( ) 函数的有用情况?
【问题讨论】:
标签: python python-3.x ascii standard-library
我已经开始浏览Python标准库了:(http://docs.python.org/3/library/functions.html)
试图进一步熟悉基本的python。关于ascii()函数的解释,我看的不是很清楚。
是否有人能够提供一个简明的解释,举例说明可以使用 ascii( ) 函数的有用情况?
【问题讨论】:
标签: python python-3.x ascii standard-library
ascii() 是一个函数,它对repr() 的输出进行编码,以便对repr() 生成的输出中不在 ASCII 范围内的任何代码点使用转义序列。
因此,像 ë 这样的拉丁语 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 字符串文字,请参阅 available escape code syntax。
与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 所称);没有?
e 和组合分音符组成的分解形式。
ascii() 可用于准确找出字符串中的内容。如果字符串包含空格或不可打印的字符,或者如果终端由于字符编码不匹配而将字符串转换为mojibake,则查看字符串的ascii 表示很有用,因为它提供了可见且明确的表示那些原本不可读的字符,这些字符将在每个人的终端上以相同的方式打印。
Stackoverflow 上经常出现关于错误打印字符串的问题,有时很难说出发生了什么,因为问题只显示了 mojibake,而不是字符串的明确表示。当提问者显示ascii 表示(或Python 2 中的repr)时,情况就会变得更加清晰。
【讨论】: