我用python编写了xmpp bot。它的一个插件能够执行操作系统命令并向用户发送输出。据我所知,输出应该是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
应该做这个工作。在我的机器上,当Python在命令提示窗口中运行时,它包含cp850
,而cp1252
在空闲时。你的应该分别包含cp866
和cp1251
。更新您说您仍然需要空闲的cp866。请注意:
因此,当你的应用程序启动时,检查你是否在Windows上,如果是,分析
os.popen('chcp').read()
的结果。:
之前的文本可能依赖于区域设置。codepage = result.split()[-1]
可能足够好的“解析”。在没有Windows/MS-DOS分离特性的Unix上,sys.stdout.encoding
应该没问题。sys.getdefaultencoding()
返回python的默认编码,除非您更改了它,否则它是ASCII。ASCII不支持俄语字符。您需要手动或使用locale module确定实际文本的编码方式。
典型的是:
Ascii没有超过1270x7f的定义字符值。也许您是指西里尔码页?是866
见http://en.wikipedia.org/wiki/Code_page
编辑:由于这个答案被标记为正确,大概886起作用,但正如其他答案所指出的,886并不是唯一的俄语代码页。如果您使用的代码页与俄罗斯符号编码时使用的代码页不同,则会得到错误的结果。
相关问题 更多 >
编程相关推荐