用Python将ascii转换为utf-8

2024-05-21 02:09:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 用户in命令cmd插件协议outputos
3条回答

你说“”sys.getdefaultencoding()表示默认的命令提示符编码是“ascii”

sys.getdefaultencoding没有提到“命令提示”编码。

在Windows上,sys.stdout.encoding应该做这个工作。在我的机器上,当Python在命令提示窗口中运行时,它包含cp850,而cp1252在空闲时。你的应该分别包含cp866cp1251

更新您说您仍然需要空闲的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应该没问题。

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

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

典型的是:

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

Ascii没有超过1270x7f的定义字符值。也许您是指西里尔码页?是866

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

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

相关问题 更多 >