2014-02-11 35 views

回答

4

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码点,使用转义码序列,因为使用\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由两个不同的码点组成。

+0

我会补充说'\ x'就像'\ u'和'\ U',是指一个Unicode _code point_。另外,从技术上讲,据我所知,'two'包含两个_code points_,而不是字符(和一个用户感知的字符,就像Unicode所称的那样)。没有? – EOL

+1

@EOL:是的,我在这里使用的字符和代码点太松散了。我已更新该帖子。 –

+0

谢谢。还有一点:我不是一个完整的专家,但“因此,像'ë'这样的拉丁语1代码点由Python转义序列\ xeb代替”应该是我认为的“。因此,一个拉丁语__字符类似于ë由Python转义序列\ xeb而不是_(因为“有Unicode代码点EB在十六进制中)_”,太...对吗? – EOL

1

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

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