【问题标题】:Bizzare eclipse-pydev console behavior奇怪的 eclipse-pydev 控制台行为
【发布时间】:2009-07-27 13:15:32
【问题描述】:

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

有解决办法吗?

(PyDEV 1.4.6、Python 2.6、控制台编码 - 继承 UTF-8、Eclipse 3.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'

【问题讨论】:

  • 我也遇到了这个问题。您在寻找解决方案方面取得了进一步进展吗?

标签: python utf-8 pydev


【解决方案1】:

好吧,我不知道如何解决它,但我已经推断出了问题的模式。

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

在我看来,你以某种方式得到了这一系列翻译:

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

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

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

这个版本的 pydev 是否​​给sys.stdin.encoding 带来了不错的价值?以及sys.stdin.encodingsys.getdefaultencoding() 的结果相比如何?

【讨论】:

  • 非常合理的解释,感谢 sys.stdin.encoding == sys.getdefaultencoding() == 'utf-8'
【解决方案2】:

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

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

在普通的 Python 控制台中可以正常工作吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2019-11-12
    相关资源
    最近更新 更多