我有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控制台I获得

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)

OS:Win XP的,Python的2.5.4 PS:对不起,我的英语:(

有帮助吗?

解决方案

您说 “” “sys.getdefaultencoding()表示,默认命令提示编码是 'ASCII'” “”

sys.getdefaultencoding说有关 “命令提示” 编码NOTHING。

在Windows中,sys.stdout.encoding应该做的工作。在我的机器,它包含在Python,在命令提示符窗口中运行cp850,并cp1252在空闲状态。你应分别包含cp866cp1251

更新您说,您仍然需要在IDLE 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()回报 Python的默认编码 - 这是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”用于像记事本应用程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top