Python и Unicode stderr

Я использовал анонимный канал для захвата всего stdout, а stderr затем печатал в richedit, это нормально, когда я использую wsprintf, но python, использующий многобайтовый символ, меня очень раздражает. как я могу преобразовать все эти выходные данные в юникод?

ОБНОВЛЕНИЕ 3 января 2010 г.:

Спасибо за ответ, но кажется, что str.encode() работал только с print xxx материалом, если во время py_runxxx() возникнет ошибка, мой перенаправленный stderr зафиксирует сообщение об ошибке в многобайтовой строке, поэтому есть ли способ заставить python вывести это сообщение в способ юникода? И, похоже, в этот пост есть доступное решение.

Я попробую позже.


person fancyzero    schedule 03.01.2010    source источник


Ответы (3)


Во-первых, помните, что консоль Windows может не полностью поддерживать Unicode.

В приведенном ниже примере вывод python в stderr и stdout выполняется с использованием UTF-8. Если вы хотите, вы можете изменить его на другие кодировки.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs, sys

reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()

sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points."
person sorin    schedule 04.01.2010
comment
Хороший! Хотя замена stdout и stderr в моем случае не понадобилась. - person derflocki; 08.07.2014

Вы можете работать с Unicode в python, либо помечая строки как Unicode (то есть: u'Hello World'), либо используя метод encode(), который есть у всех строк.

Например, если у вас есть строка Unicode, aStringVariable:

aStringVariable.encode('utf-8')

преобразует его в UTF-8. «utf-16» даст вам UTF-16, а «ascii» преобразует его в простую старую строку ASCII.

Для получения дополнительной информации см.:

person Adam Luchjenbroers    schedule 03.01.2010
comment
1. Скрывать встроенные имена (в данном случае str()) — плохая практика. 2. .encode() следует вызывать для строки Unicode, а не для строки байтов. - person jfs; 03.01.2010
comment
Это был просто плохой выбор для имени переменной. Я изменил его на что-то более очевидное. - person Adam Luchjenbroers; 04.01.2010

wsprintf?

Кажется, это вопрос "C/C++", а не вопрос Python.

Интерпретатор Python всегда записывает строки байтов в stdout/stderr, а не в строки Unicode (или «широкие»). Это означает, что Python сначала кодирует все данные Unicode, используя текущую кодировку (вероятно, sys.getdefaultencoding()).

Если вы хотите получить stdout/stderr как данные Unicode, вы должны декодировать их самостоятельно, используя правильную кодировку.

В вашей любимой библиотеке C/C++ наверняка есть все необходимое для этого.

person Antoine P.    schedule 03.01.2010