使用Python将ascii转换为utf-8
我有一个用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 个回答
ASCII码在127(0x7F)以上没有定义的字符值。也许你是指西里尔字母的编码表?它是866。
可以查看这个链接了解更多信息:http://en.wikipedia.org/wiki/Code_page
补充一下:因为这个回答被标记为正确,所以可能886确实有效,但正如其他回答所指出的,886并不是唯一的俄语编码表。如果你使用的编码表和当初编码俄语符号时用的不同,就会得到错误的结果。
sys.getdefaultencoding()
会返回Python的默认编码方式,默认情况下是ASCII编码,除非你自己修改过。ASCII编码不支持俄文字符。
你需要弄清楚实际文本使用的是什么编码,可以手动查找,或者使用locale模块来帮助你。
通常可以用类似下面的方式:
import locale
encoding = locale.getpreferredencoding(do_setlocale=True)¶
你说“sys.getdefaultencoding()显示默认的命令提示符编码是'ascii'”。
其实,sys.getdefaultencoding并没有提到“命令提示符”的编码。
在Windows系统上,sys.stdout.encoding
可以帮你找到正确的编码。在我的电脑上,当在命令提示符窗口运行Python时,它的值是cp850
,而在IDLE中则是cp1252
。你的电脑可能分别是cp866
和cp1251
。
更新 你说在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
应该是可以正常工作的。