Ответ 1
При запуске с консоли Python может обнаруживать кодировку консоли и неявно преобразовывать Unicode, напечатанный на консоль, в эту кодировку. Он все равно может выйти из строя, если эта кодировка не поддерживает символы, которые вы пытаетесь распечатать. UTF-8 может поддерживать все символы Unicode, но другие общие кодировки консоли, такие как cp437 в Windows Windows, не работают.
Когда stdout не является консолью, Python 2.X по умолчанию использует ASCII, когда он не может определить консольную кодировку. Вот почему в веб-сегменте вы должны быть явным и сами кодировать свой вывод.
В качестве примера попробуйте выполнить следующий script с консоли и с вашего веб-сервера:
import sys
print sys.stdout.encoding
С консоли вы должны получить некоторую кодировку, но с веб-сервера вы должны получить None
. Обратите внимание, что Python 2.X использует ascii
, но Python 3.X использует utf-8
, когда кодировка не может быть определена.
Проблема также может возникать на консоли при перенаправлении вывода. Этот script:
import sys
print >>sys.stderr,sys.stdout.encoding
print >>sys.stderr,sys.stderr.encoding
возвращает следующее при прямом запуске и перенаправлении stdout
:
C:\>test
cp437
cp437
C:\>test >out.txt
None
cp437
Примечание stderr
не было затронуто, так как оно не было перенаправлено.
Переменная окружения PYTHONIOENCODING
может использоваться для переопределения стандартной кодировки stdout/stdin.