代码之家  ›  专栏  ›  技术社区  ›  ymv

Bizzare eclipse pydev控制台行为

  •  1
  • ymv  · 技术社区  · 15 年前

    在eclipse pydev控制台中偶然发现一些看似随机的字符损坏: 特定字符从标准输出读取为“\xd0”(第一个字节正确,第二个“”)

    (Pydev1.4.6、Python2.6、控制台编码-继承UTF-8、Eclipse3.5、WinXP和英国语言环境)

    代码:

    import sys
    if __name__ == "__main__":
        for l in sys.stdin:
            print 'Byte:   ', repr(l)
            try:
                u = repr(unicode(l))
                print 'Unicode:', u
            except Exception, e:
                print 'Fail:   ', e
    

    йцукенгшщзхъ
    фывапролджэ
    ячсмитьбю
    ЙЦУКЕНГШЩЗХЪ
    ФЫВАПРОЛДЖЭ
    ЯЧСМИТЬБЮ
    

    和输出:

    Byte:    '\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd\xd0\xb3\xd1\x88\xd1\x89\xd0\xb7\xd1\x85\xd1\x8a\r\n'
    Unicode: u'\u0439\u0446\u0443\u043a\u0435\u043d\u0433\u0448\u0449\u0437\u0445\u044a\r\n'
    Byte:    '\xd1\x84\xd1\x8b\xd0\xb2\xd0\xb0\xd0\xbf\xd1\x80\xd0\xbe\xd0\xbb\xd0\xb4\xd0\xb6\xd1?\r\n'
    Fail:    'utf8' codec can't decode bytes in position 20-21: invalid data
    Byte:    '\xd1?\xd1\x87\xd1?\xd0\xbc\xd0\xb8\xd1\x82\xd1\x8c\xd0\xb1\xd1\x8e\r\n'
    Fail:    'utf8' codec can't decode bytes in position 0-1: invalid data
    Byte:    '\xd0\x99\xd0\xa6\xd0\xa3\xd0\x9a\xd0\x95\xd0?\xd0\x93\xd0\xa8\xd0\xa9\xd0\x97\xd0\xa5\xd0\xaa\r\n'
    Fail:    'utf8' codec can't decode bytes in position 10-11: invalid data
    Byte:    '\xd0\xa4\xd0\xab\xd0\x92\xd0?\xd0\x9f\xd0\xa0\xd0\x9e\xd0\x9b\xd0\x94\xd0\x96\xd0\xad\r\n'
    Fail:    'utf8' codec can't decode bytes in position 6-7: invalid data
    Byte:    '\xd0\xaf\xd0\xa7\xd0\xa1\xd0\x9c\xd0\x98\xd0\xa2\xd0\xac\xd0\x91\xd0\xae\r\n'
    Unicode: u'\u042f\u0427\u0421\u041c\u0418\u0422\u042c\u0411\u042e\r\n'
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Martin    15 年前

    嗯,我不知道如何修复它,但我已经推断出了出错的模式。

    替换为“?”的字节正是中未定义的字节 windows-1252 -即字节0x81、0x8d、0x8f、0x90和0x9d。

    在我看来,这是一系列的翻译:

    • unicode输入->utf-8中的字节序列

    • utf-8字节->由期望输入为Windows-1252的内容读取,因此将不可能的字节转换为“ ? "

    • 中的字符通过windows-1252转换回字节,并输入变量 l .

    sys.stdin.encoding 一个合理的价值?你是怎么做到的 sys.stdin.encoding sys.getdefaultencoding() ?

        2
  •  0
  •   Vinay Sajip    15 年前

    我不太确定输入编码,但我发现,对于tty流的输出编码,Python2.x需要显式编码步骤,但Python3.x不需要。

    因此,对于输入,您可能需要使用显式解码步骤,例如。 l.decode(sys.stdin.encoding) .