Python 使用“utf-8”编码unicode仅显示非ascii的字节字符串

Python 使用“utf-8”编码unicode仅显示非ascii的字节字符串,python,python-2.7,unicode,Python,Python 2.7,Unicode,我正在运行python2.7.10 我想弄清楚为什么会出现以下行为。当然有合理的解释 所以我定义了两个unicode字符,第一个字符在ascii集中,第二个字符在ascii之外 >>> a=u'\u0041' >>> b=u'\u1234' >>> print a A >>> print b ሴ 现在我对它进行编码,看看对应的字节是什么。但只有后者能给出我期望看到的结果 >>> a.encode('utf

我正在运行python2.7.10

我想弄清楚为什么会出现以下行为。当然有合理的解释

所以我定义了两个unicode字符,第一个字符在ascii集中,第二个字符在ascii之外

>>> 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是内部序数的Unicode十六进制值 -当我打印这些字符时,解释器会打印对应于每个unicode字节的实际字符。 -当我编码时,我假设它将使用我在本例中提供的utf-8编码方案转换为字节字符串。我希望看到a.encode的bytestring,就像b.encode一样


我遗漏了什么?

没有瑕疵。您编码到UTF-8,UTF-8对Unicode标准的前127个代码点使用与ASCII标准相同的字节,对其他所有内容使用2到4之间的多个字节

然后在终端中回显该值,该终端使用repr函数构建调试表示。该表示为字符串生成一个有效的Python表达式,该表达式是ASCII安全的。该值中任何不可打印为ASCII字符的字节将显示为转义序列。因此,UTF-8字节显示为\xhh十六进制转义

最重要的是,因为A是一个可打印的ASCII字符,所以它按原样显示;任何代码编辑器或终端都会接受ASCII码,对于大多数英文文本来说,显示实际文本更为有用

请注意,您对存储在a和b中的unicode值使用了print,这意味着Python将这些值编码到终端编解码器中,并与终端协调以生成正确的输出。您没有回显解释器中的值。如果您这样做了,您还会看到调试输出:

>>> a = u'\u0041'
>>> b = u'\u1234'
>>> a
u'A'
>>> b
u'\u1234'

在Python3中,repr函数的功能,或者更确切地说,对象。repr_uuu钩子已经更新,以生成一个unicode字符串,其中大多数可打印的代码点都没有转义。使用新的ascii函数获取上述行为。

没有缺陷。您编码到UTF-8,UTF-8对Unicode标准的前127个代码点使用与ASCII标准相同的字节,对其他所有内容使用2到4之间的多个字节

然后在终端中回显该值,该终端使用repr函数构建调试表示。该表示为字符串生成一个有效的Python表达式,该表达式是ASCII安全的。该值中任何不可打印为ASCII字符的字节将显示为转义序列。因此,UTF-8字节显示为\xhh十六进制转义

最重要的是,因为A是一个可打印的ASCII字符,所以它按原样显示;任何代码编辑器或终端都会接受ASCII码,对于大多数英文文本来说,显示实际文本更为有用

请注意,您对存储在a和b中的unicode值使用了print,这意味着Python将这些值编码到终端编解码器中,并与终端协调以生成正确的输出。您没有回显解释器中的值。如果您这样做了,您还会看到调试输出:

>>> a = u'\u0041'
>>> b = u'\u1234'
>>> a
u'A'
>>> b
u'\u1234'

在Python3中,repr函数的功能,或者更确切地说,对象。repr_uuu钩子已经更新,以生成一个unicode字符串,其中大多数可打印的代码点都没有转义。使用新的ascii函数获取上述行为。

完全有意义。非常感谢。是否有一种方法可以像不可打印的代码点一样打印ascii安全代码点的转义序列\xhh?@ajaysdesk:您必须手动执行此操作。例如,您可以使用binascii.hexlify函数将所有字节转换为十六进制输出,但不使用\x前缀。谢谢。我想要的完全有道理。非常感谢。是否有一种方法可以像不可打印的代码点一样打印ascii安全代码点的转义序列\xhh?@ajaysdesk:您必须手动执行此操作。例如,您可以使用binascii.hexlify函数将所有字节转换为十六进制输出,但不使用\x前缀。谢谢。正是我想要的