Кодировка символов от Python2 до Python3 - PullRequest
1 голос
/ 27 мая 2020

У меня есть строка x, определенная как ниже

x = b'LF                                                           \xa9 2020 by S&P Global Inc.,200523\n'

In i Python2

In [10]: x
Out[10]: 'LF                                                           \xa9 2020 by S&P Global Inc.,200523\n'

In [11]: print(x)
LF                                                           � 2020 by S&P Global Inc.,200523

In [12]: x.decode('ISO-8859-1')
Out[12]: u'LF                                                           \xa9 2020 by S&P Global Inc.,200523\n'

In [13]: print(x.decode('ISO-8859-1'))
LF                                                           © 2020 by S&P Global Inc.,200523

Вопрос 1: почему вывод для x и print (x) разные? То же самое между x.decode ('ISO-8859-1') и print (x.decode ('ISO-8859-1')) .

В i Python3

In [3]: x                                                                                                                                                                                           
Out[3]: b'LF                                                           \xa9 2020 by S&P Global Inc.,200523\n'

In [4]: print(x)                                                                                                                                                                                    
b'LF                                                           \xa9 2020 by S&P Global Inc.,200523\n'

In [5]: x.decode('ISO-8859-1')                                                                                                                                                                      
Out[5]: 'LF                                                           © 2020 by S&P Global Inc.,200523\n'

In [7]: print(x.decode('ISO-8859-1'))                                                                                                                                                               
LF                                                           © 2020 by S&P Global Inc.,200523

Вопрос 2: Как видите, в Python3 выходные данные для x и print (x) совпадают. Таковы x.decode ('ISO-8859-1') и print (x.decode ('ISO-8859-1')). В Python2 это не так. Почему это различие между Python2 и Python3?

Вопрос 3: почему вывод print (x) в Python 2 и 3 отличается, вывод x одинаковы?

Вопрос 4: почему вывод x.decode ('ISO-8859-1') in Python 2 и 3 отличается , а print такие же?

1 Ответ

1 голос
/ 27 мая 2020

Вопрос 1: почему выходные данные для x и print (x) отличаются?

Простой ввод x в REPL можно представить как:

>>> print repr(x)
'LF                                                           \xa9 2020 by S&P Global Inc.,200523\n'

Вопрос 2: Как видите, в Python3 вывод для x и print (x) одинаковый. Таковы x.decode ('ISO-8859-1') и print (x.decode ('ISO-8859-1')). В Python2 это не так. Почему это различие между Python2 и Python3?

Потому что x - это объект bytes в Python 3, где print() не будет пытаться декодировать байтовую строку. Python 3 bytes представление отображения двоичных значений более 127 с использованием соответствующей escape-последовательности.

Вопрос 3: почему вывод print (x) в Python 2 и 3 разные, результат x одинаков?

Потому что repr(x) дает то же самое для Python 2 и 3.

Вопрос 4: почему вывод x.decode ('ISO-8859-1') в Python 2 и 3 отличается, но печать одинакова?

Потому что x.decode('ISO-8859-1') в Python 2 создает объект unicode в Python 2 и объект str в Python 3, чьи __repr__() отличаются тем, как они отображаются не-ASCII.


Если вам нужно больше внимательно прочтите все это, ознакомьтесь с Unicode и кодировками символов в Python: безболезненное руководство . (Раскрытие: я написал это.)

...