Подтвердить что ты не робот

Для чего используется unicode_literals?

Я получаю странную проблему с __future__.unicode_literals в Python. Без импорта unicode_literals я получаю правильный вывод:

# encoding: utf-8
# from __future__ import unicode_literals
name = 'helló wörld from example'
print name

Но когда я добавляю unicode_literals import:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name

Я получил эту ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 4: ordinal not in range(128)

Выполняет ли unicode_literals кодирование каждой строки как utf-8? Что делать, чтобы переопределить эту ошибку?

4b9b3361

Ответ 1

Ваш терминал или консоль не позволяют Python знать, что он поддерживает UTF-8.

Без строки from __future__ import unicode_literals вы создаете байтовую строку, которая содержит кодированные байты UTF-8. С помощью строки вы создаете строку unicode.

print должен обрабатывать эти два значения по-разному; строка байта записывается в sys.stdout без изменений. Строка unicode сначала кодируется в байты, а для этого Python обращается к sys.stdout.encoding. Если ваша система неправильно сообщает Python, какой кодек поддерживает, по умолчанию используется ASCII.

Ваша система не сообщила Python, какой кодек использовать; sys.stdout.encoding устанавливается в ASCII, а значение unicode для печати не удалось.

Вы можете проверить это, вручную кодируя UTF-8 при печати:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name.encode('utf8')

и вы можете воспроизвести проблему, создав литералы в формате unicode без оператора импорта from __future__:

# encoding: utf-8
name = u'helló wörld from example'
print name

где u'..' также является литералом в формате unicode.

Без подробностей о том, что такое ваша среда, трудно сказать, что такое решение; это очень сильно зависит от ОС и используемой консоли или терминала.