Форум сайта python.su
использую 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()
и пока все ок
проблема в том, что нельзя быстро распечатать тот же словарь, если в нем есть кириллица - получаю этот эксепшен
можно ли как-то сказать принту, чтобы он все выводимые строки декодировал перед выводом?
Офлайн
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
а ещё можно сам принт подемнить
Офлайн
o7412369815963Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
Офлайн
Андрей Светловo7412369815963Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
# coding: cp1251
print u'Привет'
$ python 1.py
Привет
# coding: utf8
print u'Привет'
$ python 1.py
Привет
Отредактировано (Июль 1, 2011 16:47:15)
Офлайн
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
Офлайн
Андрей СветловДа, точно.
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
Офлайн
Укажите это в вашей статье http://www.py-my.ru/post/4bfb3c6a1d41c846bc00009b , если не трудно
И reload(sys) мне категорически не нравится. Лучше объяснить, как сделать правильный sys.stdout/sys.stderr
Офлайн
Порыскал по инету, предлагают:
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
Отредактировано (Июль 5, 2011 22:04:17)
Офлайн
Наверное, нужно писать свой file-like object. В котором на write перебрасывать str без изменений, а для unicode делать конвертацию в нужную кодировку.
Я всегда так поступал — и ни разу не ломалось.
Офлайн