Предположим на мгновение, что нельзя использовать print
(и таким образом пользоваться преимуществами автоматического обнаружения кодировки). Так что это оставляет нас с sys.stdout
. Однако sys.stdout
настолько тупой, как not do any sensible encoding.Написание строк юникода через sys.stdout в Python
Теперь один читает вики-страницу Python PrintFails и идет попробовать следующий код:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
Однако это тоже не работает (по крайней мере, на Mac). Слишком понятно, почему:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
(UTF-8 - это то, что понимает терминал).
Так один изменяет вышеприведенный код:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
И теперь Юникода строки надлежащим образом отправлены sys.stdout
и, следовательно, правильно напечатаны на терминале (sys.stdout
присоединен терминал).
Правильно ли это написать строки Unicode в sys.stdout
или я должен делать что-то еще?
EDIT: иногда - скажем, когда перенаправив вывод less
- sys.stdout.encoding
будет None
. в этом случае вышеуказанный код не сработает.
s/my/1/для консистенции – icedwater