Акцентуация в питоне: структура и цикл
У меня есть набор, заполненный значением, присутствующим в JSON, когда я печатаю свой набор, я получаю следующий вывод:
set(['Path\xc3\xa9', 'Synergy Cin\xc3\xa9ma'])
но если я печатаю каждый элемент с помощью цикла for, я получаю следующий вывод:
Pathé
Synergy Cinéma
Почему у меня нет одинаковой кодировки для каждого слова?
1 ответ
Я предполагаю, что вы используете Python 2, и это может быть связано с поведением кодировки по умолчанию. Значение, хранящееся в вашем наборе, является "закодированным" значением, и когда вы используете print
(который основан на __repr__
и / или __str__
методы объекта) вы получите декодированный / форматированный вывод (в соответствии с кодировкой системы по умолчанию).
Вы можете получить информацию о кодировке по умолчанию, используемой с функцией sys.getdefaultencoding()
Обратите внимание, что в Python 3 кодировка utf-8
по умолчанию (т.е. по умолчанию "любая созданная строка (...) хранится как Unicode", в соответствии с документацией), и вы не будете вести себя точно так же (вы можете увидеть в фрагменте python 2, что хэшированные значения, как питон set
s основаны на них, одинаковы, если ваша входная строка закодирована или нет):
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