Python拉丁字符和Unicode

时间:2014-04-22 12:54:25

标签: python python-2.7 unicode latin1 python-unicode

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

以下是我将这些关键字添加到列表中的代码:

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

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

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

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

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

2 个答案:

答案 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 ]