我正在运行python2.7.10
试图绕过为什么会出现以下行为。 (当然有合理的解释)
所以我定义了两个unicode字符,只有第一个在ascii-set中,第二个在它之外。
>>> a=u'\u0041'
>>> b=u'\u1234'
>>> print a
A
>>> print b
ሴ
现在我编码它以查看相应的字节是什么。但只有后者才能给出我期望看到的结果(字节)
>>> a.encode('utf-8')
'A'
>>> b.encode('utf-8')
'\xe1\x88\xb4'
也许这个问题符合我的期望,如果是这样,你们中的一个人可以解释这个缺陷所在。 - 我的a,b是unicodes(内部的十六进制值) - 当我打印这些时,解释器打印对应于每个unicode字节的实际字符。 - 当我编码时,我假设它将使用我提供的编码方案(在本例中为utf-8)转换为字节串。我希望看到a.encode的字节串,就像我为b.encode做的那样。
我错过了什么?
答案 0 :(得分:4)
没有任何缺陷。您编码为UTF-8,它使用与Unicode标准的前127个代码点的ASCII标准相同的字节,并使用多个字节(2到4之间)用于其他所有内容。
然后,您在终端中回显该值,该值使用repr()
函数构建调试表示。该表示为字符串生成有效的Python表达式,一个 ASCII安全。该值中的任何字节都不是可打印作为ASCII字符,显示为转义序列。因此,UTF-8字节显示为\xhh
十六进制转义。
最重要的是,因为A
是一个可打印的ASCII字符,所以它按原样显示;任何代码编辑器或终端都会接受ASCII,而对于大多数显示实际文本的英文文本来说都非常有用。
请注意,您使用 print
表示存储在unicode
和a
中的b
值,这意味着Python会将这些值编码到您的终端编解码器,与您的终端协调以产生正确的输出。您没有在解释器中回显值。如果你这样做了,你也看到了调试输出:
>>> a = u'\u0041'
>>> b = u'\u1234'
>>> a
u'A'
>>> b
u'\u1234'
在Python 3中,repr()
函数(或更确切地说,object.__repr__
挂钩)的功能已更新,以生成unicode
字符串,其中大多数可打印代码点未转义。使用新的ascii()
函数来获得上述行为。