2016-03-21 6 views
0

У меня есть набор наполненного значения, которые присутствуют в формате JSON, когда я печатаю мой набор я получил следующий вывод:Акцентуации в Python: структура и цикл

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 ", в соответствии с documentation), и у вас не будет такого же поведения (вы можете увидеть в фрагмент python 2, что хешированные значения, поскольку python 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