Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python拉丁字符和Unicode_Python_Python 2.7_Unicode_Latin1_Python Unicode - Fatal编程技术网

Python拉丁字符和Unicode

Python拉丁字符和Unicode,python,python-2.7,unicode,latin1,python-unicode,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'] 似乎print函数正确地显示

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

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

print "Adding: " + self.keyword
leaf_list.append(self.keyword)
print leaf_list
如果本例中的关键字为
université
,则我的输出为:

Adding: université
['universit\xc3\xa9']
似乎print函数正确地显示了拉丁字符,但当我将其添加到列表中时,它会被解码


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

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

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

如果您使用的是Unicode对象,则表示仍将使用
\xhh
转义符,但仅适用于拉丁语-1范围(ASCII之外)的Unicode代码点(其余部分显示为
\uhhh
\uhhhhh
转义符,具体取决于它们的代码点);打印时,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é
注意,长度反映了
é
码点也被编码为两个字节。顺便说一句,在将
字符粘贴到Python会话中时,是我的终端向Python提供了
\xc3\xa9
字节,因为它被配置为使用UTF-8,Python在我定义
u'.
Unicode对象文字时检测到了这一点并对字节进行了解码

我强烈建议您阅读以下文章,了解Python如何处理Unicode,以及Unicode文本和编码字节字符串之间的区别:

>>> 'université'
'universit\xc3\xa9'
>>> len('université')
11
>>> 'université'.decode('utf8')
u'universit\xe9'
>>> print 'université'
université
  • 乔尔斯波尔斯基

  • 内德·巴奇尔德


当您打印列表时,您会得到它所包含的项目的
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 ]
您的终端知道如何解释UTF-8。字符串内容仅为(解码)字节。