2010-02-08 5 views
20

У меня проблема с Unicode в Python. Я могу напечатать выходной штраф в обычном терминале, но если перенаправить stdout в другом месте (или захватить его с помощью subprocess модуля), я получаю UnicodeEncodeError:UnicodeEncodeError при перенаправлении stdout

$ cat example.py 
print u'Example: \u00F1' 
$ python example.py 
Example: ñ 
$ python example.py > /dev/null 
Traceback (most recent call last): 
    File "example.py", line 1, in <module> 
    print u'Example: \u00F1' 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 9: ordinal not in range(128) 

Почему это? Как я могу это исправить?

+1

http://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python - по сути тот же вопрос, ответы решают проблему, с которой я (надеюсь). – dbr

ответ

8

Трубы, которые не приводят к терминалу, не имеют кодировки, поэтому вам необходимо будет проверить sys.stdout.isatty() и закодировать при необходимости.

+3

Или (даже лучше) просто кодировать. –

+0

Подробнее о том, как определить кодировку: http://www.python.org/dev/peps/pep-0263/ –

+1

Нет, PEP 263 рассказывает о кодировке * source * и не имеет ничего общего с выходными кодировками. –