Вы можете попробовать:
print name.string.encode('ascii', 'replace')
Вывод должен быть принят независимо от того, какая кодировка sys.stdout
(включая None).
Фактически, файлоподобный объект, на который вы печатаете, может не поддерживать UTF-8. Вот пример: если у вас явно мягкая программа
# -*- coding: utf-8 -*-
print u"hérisson"
тогда запуск его в терминале, который может печатать символы с акцентом, работает нормально:
lebigot@weinberg /tmp % python2.5 test.py
hérisson
, но печать на стандартный вывод, подключенный к каналу Unix, не выполняется:
lebigot@weinberg /tmp % python2.5 test.py | cat
Traceback (most recent call last):
File "test.py", line 3, in <module>
print u"hérisson"
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128)
потому что sys.stdout
имеет кодировку None
, в данном случае: Python считает, что программа, которая читает через канал, должна получить ASCII, и печать завершается неудачно, потому что ASCII не может представлять слово, которое мы хотим напечатать. Решение, подобное приведенному выше, решает проблему.
Примечание: Вы можете проверить кодировку вашего стандартного вывода с помощью:
print sys.stdout.encoding
Это может помочь вам отладить проблемы с кодировкой.