奇怪的eclipse-pydev控制台行为

1 投票
2 回答
1227 浏览
提问于 2025-04-15 13:11

在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'

2 个回答

0

我对输入编码不是很确定,但我发现输出到终端(tty流)时,Python 2.x需要明确指定编码步骤,而Python 3.x就不需要了。

所以对于输入,你可能需要一个明确的解码步骤,比如用 l.decode(sys.stdin.encoding) 这样的代码。

在普通的Python控制台里这样做可以正常工作吗?

2

嗯,我不知道怎么解决这个问题,但我发现了出错的规律。

被替换成“?”的字节,正是那些在 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() 的结果有什么区别呢?

撰写回答