我有一个树形结构,其中关键字可能包含一些拉丁字符。我有一个循环遍历树的所有叶子的函数,并在特定条件下将每个关键字添加到列表中。
以下是我将这些关键字添加到列表中的代码:
print "Adding: " + self.keyword
leaf_list.append(self.keyword)
print leaf_list
如果这种情况下的关键字是université
,那么我的输出是:
Adding: université
['universit\xc3\xa9']
打印功能似乎正确显示拉丁字符,但当我将其添加到列表中时,它会被解码。
我该怎么改变?我需要能够使用标准的拉丁字符打印列表,而不是它们的解码版本。
答案 0 :(得分:3)
您没有unicode对象,而是具有UTF-8编码文本的字节字符串。如果您的终端配置为处理UTF-8文本,则将此类字节字符串打印到终端可能。
将列表转换为字符串时,列表内容显示为表示; repr()
函数的结果。字符串对象的表示使用转义码表示可打印ASCII范围之外的任何字节;例如,换行符由\n
替换。您的UTF-8字节由\xhh
转义序列表示。
如果您使用的是Unicode对象,则表示将使用\xhh
转义仍,但仅适用于Latin-1范围内的Unicode代码点(ASCII外)(其余部分显示为\uhhhh
和\Uhhhhhhhh
根据其代码点进行转义;打印时,Python会自动将这些值编码为终端的正确编码:
>>> u'université'
u'universit\xe9'
>>> len(u'université')
10
>>> print u'université'
université
将此与字节串进行比较:
>>> 'université'
'universit\xc3\xa9'
>>> len('université')
11
>>> 'université'.decode('utf8')
u'universit\xe9'
>>> print 'université'
université
请注意,长度反映了é
代码点也被编码为两个字节。顺便说一下,当我将\xc3\xa9
字符粘贴到Python会话中时,我的终端向Python提供了é
个字节,因为它配置为使用UTF-8,并且Python已检测到并解码我定义u'..'
Unicode对象文字时的字节。
我强烈建议您阅读以下文章,了解Python如何处理Unicode,以及Unicode文本和编码字节字符串之间的区别:
答案 1 :(得分:0)
当您打印列表时,您将获得其中包含的repr
项,其中字符串与其内容不同:
>>> a = ['foo', 'bär']
>>> print(a[0])
foo
>>> print(repr(a[0]))
'foo'
>>> print(a[1])
bär
>>> print(repr(a[1]))
'b\xc3\xa4r'
repr
的输出应该是程序员友好的,不是用户友好的,因此引号和十六进制代码。要以用户友好的方式打印列表,请编写自己的循环。 E.g。
>>> print '[', ', '.join(a), ']'
[ foo, bär ]