LINUX.ORG.RU

Снова юникод в python


0

2

Помогите понять следующее поведение:

$ cat utf.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a=u'фыва'
print a
$ ./utf.py 
фыва
$ ./utf.py > tmp.txt
Traceback (most recent call last):
  File "./utf.py", line 5, in <module>
    print a
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 

Ответ на: комментарий от generator

Хороший вопрос. Я не знаю, просто интуитивно проверил с перекодировкой - завелось. Вот так я и пишу на питоне :/

jessey
()
Ответ на: комментарий от generator

Видимо когда stdout - tty, используется кодировка из locale.

При записи в файл не решается своевольничать - в принципе адекватно.

anonymous
()

Еще можно просто вставить:

import sys
reload(sys);         
sys.setdefaultencoding('utf8')
в начале модуля.

s0rg
()
Ответ на: комментарий от anonymous

Когда ты печатаешь что-то в терминал, что интерпретатор знает кодировку. К примеру,

>>> import sys
>>> sys.stdout.encoding
'UTF-8'

Но вот если используешь пайпы или перенаправляешь вывод в файл - тогда sys.stdout.encoding равняется None.

В качестве решения проблемы, можно похачить sys.stdout:

import sys, codecs, locale
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
print u"тест" 
beka
()
Ответ на: комментарий от anonymous

При записи в файл не решается своевольничать - в принципе адекватно.

Что-то мне не кажется адекватной принудительная инициализация значениями из locale. В случае необходимости выбора другой кодировки - другое дело.

yyk ★★★★★
()
Ответ на: комментарий от generator

Любая программа может узнать выводится ее STDOUT или STDERR в терминал или нет: man isatty.

Вот простая демонстрация isatty в питоне:

#!/usr/bin/env python
import sys

output = "It is a tty!" if sys.stdout.isatty() else "It's not a tty, output was redirected."

print output

$ python test.py
It is a tty!
$ python test.py > somefile
$ 
$ cat somefile
It's not a tty, output was redirected.
beka
()
Ответ на: комментарий от aedeph_

pep 0263

Нет, в PEP 0263 говорится про Source Code Encodings. Там нет ничего про stdout.

beka
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.