【问题标题】:Python - The Standard Library - ascii( ) FunctionPython - 标准库 - ascii() 函数
【发布时间】: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


    【解决方案1】:

    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 所称);没有?
    • @EOL:是的,我在这里使用的字符和代码点有点太松散了。我已经更新了帖子。
    • 谢谢。还有一点:我不是一个完整的专家,但是“所以像 ë 这样的拉丁语 1 代码点由 Python 转义序列 \xeb 表示”我认为应该是“所以拉丁语 1 字符就像 ë 由 Python 转义序列 \xeb 表示,而不是 (因为 ë 具有十六进制的 Unicode 代码点 EB)。”,也是……对吗?
    • 它仍然是一个代码点(编号为 U+00EB),而不是由 e 和组合分音符组成的分解形式。
    【解决方案2】:

    ascii() 可用于准确找出字符串中的内容。如果字符串包含空格或不可打印的字符,或者如果终端由于字符编码不匹配而将字符串转换为mojibake,则查看字符串的ascii 表示很有用,因为它提供了可见且明确的表示那些原本不可读的字符,这些字符将在每个人的终端上以相同的方式打印。

    Stackoverflow 上经常出现关于错误打印字符串的问题,有时很难说出发生了什么,因为问题只显示了 mojibake,而不是字符串的明确表示。当提问者显示ascii 表示(或Python 2 中的repr)时,情况就会变得更加清晰。

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多