从ASCII转换为UTF-8与Python
-
20-09-2019 - |
题
我有XMPP机器人Python编写的。一个它的插件能够执行操作系统命令,并发送输出给用户。据我所知输出应该是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控制台I获得
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)
OS:Win XP的,Python的2.5.4 PS:对不起,我的英语:(
解决方案
您说 “” “sys.getdefaultencoding()表示,默认命令提示编码是 'ASCII'” “”
sys.getdefaultencoding说有关 “命令提示” 编码NOTHING。
在Windows中,sys.stdout.encoding
应该做的工作。在我的机器,它包含在Python,在命令提示符窗口中运行cp850
,并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
应该没问题。
其他提示
sys.getdefaultencoding()
回报 Python的默认编码 - 这是ASCII除非你已经改变了它。 ASCII不支持俄语字符。
您需要解决的是,无论是手动编码的实际文本,或者使用的本地化模块。
典型地是这样的:
import locale
encoding = locale.getpreferredencoding(do_setlocale=True)¶
的Ascii具有高于127 0x7F的没有定义的字符值。也许你的意思是西里尔代码页?它是866
请参阅 http://en.wikipedia.org/wiki/Code_page
编辑:既然这个答案是正确标注大概886工作,但由于其他答案已经指出了,886是不是唯一的俄语语言代码页。如果您使用的代码页从用来当俄罗斯的符号进行编码的不同,你会得到错误的结果。
在Python的cp855', 'CP866', 'CP1251', 'iso8859_5', 'koi8_r' 被不同俄罗斯代码页。你需要使用正确的一个POPEN的解码输出。在Windows控制台中,“CHCP”命令列出控制台命令使用的代码页。这并不一定是相同的代码页的Windows应用程序。在美国的Windows,“CP437”用于控制台和“CP1252”用于像记事本应用程序。