2014-04-22 141 views
1

我有一个树形结构,其中的关键字可能包含一些拉丁字符。我有一个函数循环遍历树的所有叶,并在特定条件下将每个关键字添加到列表中。Python拉丁字符和Unicode

这里是我的代码有添加这些关键字列表:

print "Adding: " + self.keyword 
leaf_list.append(self.keyword) 
print leaf_list 

如果在这种情况下,关键字是université,那么我的输出是:

Adding: université 
['universit\xc3\xa9'] 

看来,打印功能正确显示拉丁字符,但是当我将它添加到列表中时,它会被解码。

我该如何改变这种情况?我需要能够使用标准的拉丁字符打印列表,而不是它们的解码版本。

+0

您的**终端**知道如何解释UTF-8。字符串内容只是(解码的)字节。 –

回答

3

您没有unicode对象,但是使用UTF-8编码文本的字节字符串。如果您的终端配置为处理UTF-8文本,则打印此类字节字符串到您的终端可能会工作。

将列表转换为字符串时,列表内容显示为表示; repr()函数的结果。字符串对象的表示对可打印的ASCII范围以外的任何字节使用转义码;例如换行符由\n取代。您的UTF-8字节由\xhh转义序列表示。

如果您正在使用Unicode对象,表示将使用\xhh逃逸仍然,但在Latin-1的范围内的Unicode代码点(外ASCII)只(其余都显示与取决于他们的代码点\uhhhh\Uhhhhhhhh逃逸);当印刷的Python这样的值自动地编码到正确的编码为您的终端:该长度反映了é码点被编码为两个字节作为

>>> 'université' 
'universit\xc3\xa9' 
>>> len('université') 
11 
>>> 'université'.decode('utf8') 
u'universit\xe9' 
>>> print 'université' 
université 

注:

>>> u'université' 
u'universit\xe9' 
>>> len(u'université') 
10 
>>> print u'université' 
université 

比较这对字节串好。顺便提一句,当它被配置为使用UTF-8时,我的终端向Python提供了\xc3\xa9字节,并且Python已经检测到这个字节,并在我定义了u'..' Unicode时对字节进行了解码对象文字。

我强烈建议您阅读以下文章了解Python的处理Unicode,什么不同的是Unicode文本和编码的字节字符串之间:

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输出应该是程序员友好,不用户友好的,因此引号和十六进制代码。要以用户友好的方式打印清单,请编写您自己的循环。例如。

>>> print '[', ', '.join(a), ']' 
[ foo, bär ]