【问题标题】:Python Latin Characters and UnicodePython 拉丁字符和 Unicode
【发布时间】:2014-06-06 20:47:37
【问题描述】:

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

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

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

如果本例中的关键字是université,那么我的输出是:

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

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

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

【问题讨论】:

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

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


【解决方案1】:

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

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

如果您使用 Unicode 对象,则表示将使用 \xhh 转义仍然,但仅适用于 Latin-1 范围内(ASCII 之外)的 Unicode 代码点(其余显示为 @987654328 @ 和 \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é

请注意,长度反映了é 代码点也被编码为两个字节。顺便说一下,在将é 字符粘贴到 Python 会话中时,是我的终端向 Python 提供了 \xc3\xa9 字节,因为它被配置为使用 UTF-8,而 Python 检测到这一点并在我解码字节时定义了一个 u'..' Unicode 对象字面量。

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

【讨论】:

    【解决方案2】:

    当你打印一个列表时,你会得到它所包含的项目的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 ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多