Игнат
Июль 1, 2011 08:58:46
использую python 3.2 как cgi с апач
если выводить кириллицу стандартным print получаем - Traceback (most recent call last): File “/home/user/python3/config_editor.py”, line 46, in cnf.print_rows() File “/home/user/python3/config_editor_class.py”, line 39, in print_rows print(self.sections) UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 2-7: ordinal not in range(128)
вывожу вот так:
def _print(text):
sys.stdout.buffer.write(text.encode('utf8'))
sys.stdout.flush()
и пока все ок
проблема в том, что нельзя быстро распечатать тот же словарь, если в нем есть кириллица - получаю этот эксепшен
можно ли как-то сказать принту, чтобы он все выводимые строки декодировал перед выводом?
o7412369815963
Июль 1, 2011 16:20:17
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
а ещё можно сам
принт подемнить
Андрей Светлов
Июль 1, 2011 16:32:50
o7412369815963
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.
o7412369815963
Июль 1, 2011 16:46:44
Андрей Светлов
o7412369815963
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.
# coding: cp1251
print u'Привет'
Результат:
$ python 1.py
Привет
————————————
# coding: utf8
print u'Привет'
Результат:
Ubuntu 11.04, py 2.7.1
Андрей Светлов
Июль 1, 2011 17:15:08
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
o7412369815963
Июль 1, 2011 21:07:37
Андрей Светлов
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
Да, точно.
Андрей Светлов
Июль 1, 2011 22:32:38
Укажите это в вашей статье
http://www.py-my.ru/post/4bfb3c6a1d41c846bc00009b , если не трудно
И reload(sys) мне категорически не нравится. Лучше объяснить, как сделать правильный sys.stdout/sys.stderr
o7412369815963
Июль 5, 2011 22:00:14
Порыскал по инету, предлагают:
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
Но при таком решении не возможно вывести байтовую строку: print ‘привет’
Андрей Светлов
Июль 6, 2011 12:31:46
Наверное, нужно писать свой file-like object. В котором на write перебрасывать str без изменений, а для unicode делать конвертацию в нужную кодировку.
Я всегда так поступал — и ни разу не ломалось.