代码之家  ›  专栏  ›  技术社区  ›  colriot Hassaan Rabbani

用python从ascii转换为utf-8

  •  3
  • colriot Hassaan Rabbani  · 技术社区  · 16 年前

    我有用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 回复  |  直到 16 年前
        1
  •  1
  •   John Machin Santi    16 年前

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

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

    在Windows上, sys.stdout.encoding 应该做这个工作。在我的机器上,它包含 cp850 当python在命令提示窗口中运行时,以及 cp1252 处于空闲状态。你的应该包含 cp866 cp1251 分别。

    更新 你说你还需要闲置的CP866。注意这一点:

    IDLE 2.6.4      
    >>> import os
    >>> os.popen('chcp').read()
    'Active code page: 850\n'
    >>>
    

    因此,当应用程序启动时,请检查您是否在Windows上,如果在Windows上,请分析 os.popen('chcp').read() . 前面的文本 : 可能与区域设置有关。 codepage = result.split()[-1] 可能足够好的“解析”。在没有Windows/MS-DOS拆分特性的Unix上, sys.stdout.encoding(系统标准输出编码) 应该可以。

        2
  •  3
  •   Douglas Leeder    16 年前

    sys.getdefaultencoding() 收益率 蟒蛇 默认编码-除非您更改了它,否则它是ASCII。ASCII不支持俄语字符。

    您需要手动或使用 locale module .

    通常是这样的:

    import locale
    encoding = locale.getpreferredencoding(do_setlocale=True)¶
    
        3
  •  2
  •   John Knoeller    16 年前

    ASCII没有超过127 0x7f的定义字符值。也许您是指西里尔文代码页?它是866

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

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

        4
  •  0
  •   Mark Tolonen    16 年前

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