我有一个树形结构,其中的关键字可能包含一些拉丁字符。我有一个遍历树上所有叶子并在特定条件下将每个关键字添加到列表的函数。
这是我将这些关键字添加到列表中的代码:
print "Adding: " + self.keyword leaf_list.append(self.keyword) print leaf_list
如果在这种情况下的关键字是université,那么我的输出是:
université
Adding: université ['universit\xc3\xa9']
看来打印功能可以正确显示拉丁字符,但是当我将其添加到列表中时,它就会被解码。
我该如何更改?我需要能够使用标准拉丁字符而不是它们的解码版本来打印列表。
您没有unicode对象,但是具有UTF-8编码文本的字节字符串。印制例如字节串到你的终端 可能 ,如果你的终端被配置为处理UTF-8文本。
当转换一个列表串,该列表的内容被示出为 表示 ; repr()函数的结果。字符串对象的表示形式对可打印ASCII范围以外的任何字节使用转义码;\n例如,换行符被替换。您的UTF-8字节由\xhh转义序列表示。
repr()
\n
\xhh
如果您使用Unicode对象,表示将使用\xhh逃逸 仍 ,但在Latin-1的范围内(外ASCII)仅Unicode代码点(其余都显示与\uhhhh和\Uhhhhhhhh逃逸取决于它们的代码点); 在打印时,Python会自动将这些值编码为适合终端的正确编码:
\uhhhh
\Uhhhhhhhh
>>> 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,并且当我定义u'..'Unicode对象文字时,Python已检测到并解码了字节。
é
\xc3\xa9
u'..'
我强烈建议您阅读以下文章,以了解Python如何处理Unicode,以及Unicode文本和编码的字节字符串之间的区别是什么:
每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)作者:Joel Spolsky
在Python的Unicode指南
Ned Batchelder的实用Unicode