【问题标题】:Accentuation in python: structure and for looppython中的重音:结构和for循环
【发布时间】:2016-03-21 16:49:55
【问题描述】:
我有一个填充了 JSON 中存在的值的集合,当我打印我的集合时,我得到了以下输出:
set(['Path\xc3\xa9', 'Synergy Cin\xc3\xa9ma'])
但如果我使用 for 循环打印每个元素,我会得到以下输出:
Pathé
Synergy Cinéma
为什么我没有为每个单词获得相同的编码?
【问题讨论】:
标签:
python
encoding
non-ascii-characters
【解决方案1】:
我猜您使用的是 python 2,它可能与默认编码行为有关。您的集合中存储的值是“编码”值,当您使用 print(基于对象的底层 __repr__ 和/或 __str__ 方法)时,您将获得解码/格式化的输出(根据默认系统编码)。
您可以获得与函数sys.getdefaultencoding()一起使用的默认编码的信息
请注意,在 python 3 中,默认情况下编码为 utf-8(即,根据documentation,默认情况下“任何创建的字符串 (...) 都存储为 Unicode”)并且您不会有完全相同的行为(您可以在 python 2 sn-p 中看到散列值,因为 python sets 基于它们,无论您的输入字符串是否被编码,都是相同的):
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