1

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

2 回答 2

2

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

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

对我来说,这看起来像是您以某种方式获得了这一系列翻译:

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

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

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

这个版本的 pydev 是否​​提供sys.stdin.encoding了不错的价值?与sys.stdin.encoding结果相比如何sys.getdefaultencoding()

于 2009-07-27T17:15:26.327 回答
0

I'm not too sure about input encoding, but I've found that with output encoding to tty streams, an explicit encoding step was needed for Python 2.x but not for Python 3.x.

So for input you may need an explicit decode step using e.g. l.decode(sys.stdin.encoding).

Does it work OK in a vanilla Python console?

于 2009-07-27T14:31:48.667 回答