使用Python将ascii转换为utf-8

3 投票
4 回答
12402 浏览
提问于 2025-04-15 19:17

我有一个用Python写的xmpp机器人。它的一个插件可以执行操作系统命令,并把结果发给用户。根据我的了解,输出内容应该是类似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 个回答

2

ASCII码在127(0x7F)以上没有定义的字符值。也许你是指西里尔字母的编码表?它是866。

可以查看这个链接了解更多信息:http://en.wikipedia.org/wiki/Code_page

补充一下:因为这个回答被标记为正确,所以可能886确实有效,但正如其他回答所指出的,886并不是唯一的俄语编码表。如果你使用的编码表和当初编码俄语符号时用的不同,就会得到错误的结果。

3

sys.getdefaultencoding() 会返回Python的默认编码方式,默认情况下是ASCII编码,除非你自己修改过。ASCII编码不支持俄文字符。

你需要弄清楚实际文本使用的是什么编码,可以手动查找,或者使用locale模块来帮助你。

通常可以用类似下面的方式:

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

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

其实,sys.getdefaultencoding并没有提到“命令提示符”的编码。

在Windows系统上,sys.stdout.encoding可以帮你找到正确的编码。在我的电脑上,当在命令提示符窗口运行Python时,它的值是cp850,而在IDLE中则是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应该是可以正常工作的。

撰写回答