Pregunta

Tengo el bot xmpp escrito en Python.Uno de sus complementos puede ejecutar comandos del sistema operativo y enviar resultados al usuario.Hasta donde yo sé, la salida debe ser similar a Unicode para enviarla a través del protocolo xmpp.Así que intenté manejarlo de esta manera:

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

Pero cuando aparecen símbolos rusos en la salida, no se convierten bien.

sys.getdefaultencoding() 

dice que la codificación predeterminada del símbolo del sistema es 'ascii', pero cuando intento hacerlo

output.decode('ascii') 

en la consola de Python me sale

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)

SO:Win XP, Python 2.5.4 PS:Lo siento por mi ingles :(

¿Fue útil?

Solución

Dices """sys.getdefaultencoding() dice que la codificación predeterminada del símbolo del sistema es 'ascii'"""

sys.getdefaultencoding no dice NADA sobre la codificación del "símbolo del sistema".

En Windows, sys.stdout.encoding debería hacer el trabajo.En mi máquina, contiene cp850 cuando Python se ejecuta en una ventana del símbolo del sistema, y cp1252 en INACTIVO.El tuyo debe contener cp866 y cp1251 respectivamente.

Actualizar Dices que todavía necesitas cp866 en IDLE.Tenga en cuenta esto:

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

Entonces, cuando se inicie su aplicación, verifique si está en Windows y, de ser así, analice el resultado de os.popen('chcp').read().El texto anterior al : probablemente depende de la configuración regional. codepage = result.split()[-1] puede ser un "análisis" suficientemente bueno.En Unix, que no tiene una personalidad dividida entre Windows y MS-DOS, sys.stdout.encoding debería estar bien.

Otros consejos

Los rendimientos sys.getdefaultencoding() del pitón codificación por defecto - que es ASCII a menos que lo haya cambiado. ASCII no admite caracteres rusos.

Es necesario trabajar en lo que codifica el texto real es, ya sea manualmente o utilizando el módulo locale .

Por lo general algo como:

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

Ascii no tiene valores de carácter definido anteriormente 127 0x7F. Tal vez te refieres a la página de códigos cirílico? Es 866

http://en.wikipedia.org/wiki/Code_page

Edit: ya que esta respuesta fue marcada correcta, presumiblemente, 886 trabajaban, pero como otras respuestas han señalado que, 886 no es la única página de código de idioma ruso. Si se utiliza una página de códigos diferente de la que se utilizan en la codificación de los símbolos rusos, obtendrá un resultado erróneo.

En Python 'cp855', 'CP866', 'CP1251', 'iso8859_5', 'koi8_r' son diferentes páginas de códigos rusos. Tendrá que utilizar el más adecuado para decodificar la salida del popen. En la consola de Windows, el comando 'chcp' enumera la página de códigos utilizada por los comandos de la consola. Eso no va a ser necesariamente la misma página de códigos que las aplicaciones de Windows. En los Estados Unidos de Windows, 'cp437' se utiliza para la consola y 'CP1252' se utiliza para aplicaciones como el Bloc de notas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top