python中的重点:结构和循环

时间:2016-03-21 16:49:56

标签: python encoding non-ascii-characters

我有一个充满了JSON中存在的值的集合,当我打印我的集合时,我得到了以下输出:

set(['Path\xc3\xa9', 'Synergy Cin\xc3\xa9ma'])

但如果我使用for循环打印每个元素,我会得到以下输出:

Pathé
Synergy Cinéma

为什么我对每个单词都没有相同的编码?

1 个答案:

答案 0 :(得分:1)

我猜你使用的是python 2,它可能与默认的编码行为有关。您的集合中存储的值是“编码”值,当您使用print(基于对象的基础__repr__和/或__str__方法)时,您将获得解码/格式化输出(根据默认的系统编码)。

您可以获取有关函数sys.getdefaultencoding()

使用的默认编码的信息

请注意,在python 3中,默认情况下编码为utf-8(即默认情况下,“创建的任何字符串(...)都存储为Unicode”,根据documentation),您不会具有完全相同的行为(您可以在 python 2 片段中看到散列值,如python set基于它们,如果您的输入字符串是否已编码,则相同):

Python 2:

>>> a = b'Path\xc3\xa9'
>>> a
'Path\xc3\xa9'
>>> print(a)
Pathé
>>> sys.getdefaultencoding()
'ascii'
>>> hash('Pathé')
8776754739882320435
>>> hash(b'Path\xc3\xa9')
8776754739882320435

Python 3:

>>> a = b'Path\xc3\xa9'
>>> a
b'Path\xc3\xa9'
>>> print(a)
b'Path\xc3\xa9'
>>> print(a.decode())
Pathé
>>> sys.getdefaultencoding()
'utf-8'
>>> hash("Pathé")
1530394699459763000
>>> hash(b"Path\xc3\xa9")
1621747577200686773