Разница между питоном 2 и 3 для utf-8 - PullRequest
0 голосов
/ 03 октября 2018

Почему выходные данные отличаются для двух приведенных ниже команд?

$ python2.7 -c 'print("\303\251")' 
é   # <-- Great

$ python3.6 -c 'print("\303\251")'
é  # <-- WTF?!

Какой будет команда python3 для вывода "é" из "\ 303 \ 251"?

С уважением

1007 * Оливье

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Как объяснено в первом ответе пользователя user2357112, эта строка указывает Python 3 на печать двух символов, указанных их восьмеричным значением (восьмеричный байт указывает кодовую точку в кодировке Unicode символа):

$ python3.6 -c 'print("\303\251")'
é

Следующая строка может быть использована для поведения, аналогичного Python 2:

$ python3.6 -c 'print(b"\303\251".decode())'
é
0 голосов
/ 03 октября 2018

На Python 2 вы говорите Python печатать два байта.Он печатает два байта.Ваш терминал интерпретирует эти два байта как кодировку é и отображает é.(Похоже, ваш терминал использует UTF8.)

В Python 3 вы говорите Python печатать два символа с кодовыми точками Unicode 0o303 и 0o251 (в восьмеричном).Эти символы é.Python кодирует эти символы в системно-зависимой кодировке (вероятно, UTF8) и записывает полученные байты в стандартный вывод.Затем ваш терминал декодирует байты и отображает é.

Если вы хотите, чтобы Python 3 печатал é, присвойте ему кодовую точку Unicode (\u00e9) или просто скажите, чтобы она напечатала é:

$ python3.6 -c 'print("é")'
é
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...