Вопрос

У меня есть xmpp-бот, написанный на python.Один из его плагинов способен выполнять команды операционной системы и отправлять выходные данные пользователю.Насколько я знаю, выходные данные должны быть в формате unicode, чтобы отправлять их по протоколу xmpp.Поэтому я попытался справиться с этим таким образом:

output = os.popen(cmd).read() 
if not isinstance(output, unicode):
   output = unicode(output,'utf-8','ignore')
bot.send(xmpp.Message(mess.getFrom(),output))

Но когда в выходных данных появляются русские символы, они плохо преобразуются.

sys.getdefaultencoding() 

говорит, что кодировкой командной строки по умолчанию является "ascii", но когда я пытаюсь сделать

output.decode('ascii') 

в консоли python я получаю

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 1: 
ordinal not in range(128)

Операционная система:Win XP, Python 2.5.4 PS:Извините за мой английский :(

Это было полезно?

Решение

Вы говорите """sys.getdefaultencoding() говорит, что кодировкой командной строки по умолчанию является "ascii""""

sys.getdefaultencoding НИЧЕГО не говорит о кодировке "командной строки".

В Windows, sys.stdout.encoding должен выполнить свою работу.На моей машине он содержит cp850 когда Python запускается в окне командной строки, и cp1252 в режиме ОЖИДАНИЯ.Ваш должен содержать cp866 и cp1251 соответственно.

Обновить Вы говорите, что вам все еще нужен cp866 в режиме ОЖИДАНИЯ.Обратите внимание на это:

IDLE 2.6.4      
>>> import os
>>> os.popen('chcp').read()
'Active code page: 850\n'
>>>

Поэтому, когда ваше приложение запустится, проверьте, используете ли вы Windows, и если да, проанализируйте результат os.popen('chcp').read().Текст перед началом : вероятно, это зависит от локали. codepage = result.split()[-1] может быть, достаточно хороший "парсинг".В Unix, в котором нет раздвоения личности Windows / MS-DOS, sys.stdout.encoding все должно быть в порядке.

Другие советы

sys.getdefaultencoding() ВОЗВРАТ питоновский кодировка по умолчанию - ASCII, если вы ее не изменили.ASCII не поддерживает русские символы.

Вам нужно определить, в какой кодировке находится фактический текст, либо вручную, либо с помощью модуль локализации.

Обычно что-то вроде:

import locale
encoding = locale.getpreferredencoding(do_setlocale=True)¶

Ascii не имеет определенных символьных значений выше 127 0x7F.Возможно, вы имеете в виду кодовую страницу на кириллице?Это 866

Видишь http://en.wikipedia.org/wiki/Code_page

Редактировать:поскольку этот ответ был отмечен как правильный, предположительно, 886 сработал, но, как указывали другие ответы, 886 - не единственная кодовая страница на русском языке.Если вы используете кодовую страницу, отличную от той, которая использовалась при кодировании русских символов, вы получите неверный результат.

В Python 'cp855', 'cp866', 'cp1251', 'iso8859_5', 'koi8_r' - это разные русские кодовые страницы.Вам нужно будет использовать правильный вариант для декодирования выходных данных popen.В консоли Windows команда 'chcp' перечисляет кодовую страницу, используемую консольными командами.Это не обязательно будет та же кодовая страница, что и приложения Windows.В американской Windows 'cp437' используется для консоли, а 'cp1252' - для таких приложений, как Notepad.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top