Не похоже, что Python вообще «читает это в UTF-8». Как уже указывалось, у вас проблема с кодированием, а не проблема с декодированием. Невозможно, чтобы эта ошибка возникла из той строки, которую вы говорите. Задавая вопрос, подобный этому, всегда давайте полный ответ и сообщение об ошибке.
подозрения Кэти верны; на самом деле строка print str
является единственным возможным источником этой ошибки, и это может произойти, только если sys.stdout.encoding не задан, поэтому Python выполняет команду 'ascii'.
Переменные, которые могут повлиять на результат, - это то, какую версию Python вы используете, на какой платформе вы работаете и как именно вы запускаете свой скрипт - ни об одной из них вы нам не сообщили; пожалуйста, сделайте.
Пример: я использую Python 2.6.2 в Windows XP и запускаю ваш скрипт с некоторыми диагностическими дополнениями:
(1) import sys; print sys.stdout.encoding
вверху спереди
(2) print repr(str)
до print str
, чтобы я мог видеть, что у вас есть до того, как он упадет.
В окне командной строки, если я делаю \python26\python hockey.py
, он печатает cp850
в качестве кодировки и просто работает.
Однако, если я сделаю
\python26\python hockey.py | more
или
\python26\python hockey.py >hockey.txt
печатает None
как кодировку и выдает сообщение об ошибке в первой строке с a-with-diaeresis:
C:\junk>\python26\python hockey.py >hockey.txt
Traceback (most recent call last):
File "hockey.py", line 18, in <module>
print str
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 2: ordinal not in range(128)
Если это соответствует вашему случаю, в общем случае исправление заключается в явном кодировании вашего вывода с помощью кодировки, подходящей для механизма отображения, который вы планируете использовать.