3

我有用 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:对不起我的英语:(

4

4 回答 4

3

sys.getdefaultencoding()返回python 的默认编码——除非你改变了它,否则它是 ASCII。ASCII 不支持俄语字符。

您需要手动或使用locale 模块确定实际文本的编码方式。

通常是这样的:

import locale
encoding = locale.getpreferredencoding(do_setlocale=True)¶
于 2010-02-14T21:38:07.157 回答
2

Ascii 没有定义高于 127 0x7F 的字符值。也许您的意思是西里尔语代码页?这是866

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

编辑:由于这个答案被标记为正确,大概 886 有效,但正如其他答案所指出的那样,886 并不是唯一的俄语代码页。如果您使用的代码页与俄罗斯符号编码时使用的代码页不同,您将得到错误的结果。

于 2010-02-14T21:35:57.003 回答
1

你说 """sys.getdefaultencoding() 说默认的命令提示符编码是 'ascii'"""

sys.getdefaultencoding 没有说明“命令提示符”编码。

在 Windows 上,sys.stdout.encoding应该可以完成这项工作。在我的机器上,它包含cp850Python 在命令提示符窗口和cp1252IDLE 中运行的时间。你的应该分别包含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]可能足够好“解析”。在没有 Windows/MS-DOS 分裂个性的 Unix 上,sys.stdout.encoding应该没问题。

于 2010-02-15T00:28:40.707 回答
0

在 Python 中,“cp855”、“cp866”、“cp1251”、“iso8859_5”、“koi8_r”是不同的俄语代码页。您需要使用正确的解码 popen 的输出。在 Windows 控制台中,“chcp”命令列出了控制台命令使用的代码页。这不一定是与 Windows 应用程序相同的代码页。在美国 Windows 上,“cp437”用于控制台,“cp1252”用于记事本等应用程序。

于 2010-02-14T22:48:51.577 回答