奇怪的 eclipse-pydev 控制台行为

发布于 2024-07-27 22:11:01 字数 1641 浏览 4 评论 0原文

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

Stumbled upon some seemingly random character mangling in eclipse-pydev console:
specific characters are read from stdout as '\xd0?' (first byte correct, second "?")

Is there some solution to this?

(PyDEV 1.4.6, Python 2.6, console encoding - inherited UTF-8, Eclipse 3.5, WinXP with UK locale)

Code:

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

Input:

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

and output:

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'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幽梦紫曦~ 2024-08-03 22:11:01

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

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

在我看来,你不知何故得到了这一系列的翻译:

  • unicode input -> utf-8

    unicode 输入中的一系列字节

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

  • 通过 windows-1252 将字符转换回字节,并送入变量< code>l.

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

Well, I don't know how to fix it, but I have deduced the pattern in what goes wrong.

The bytes that get replaced with "?" are precisely those bytes that are not defined in windows-1252 - that is, bytes 0x81, 0x8d, 0x8f, 0x90, and 0x9d.

What this looks like to me is that somehow you're getting this series of translations:

  • unicode input -> series of bytes in utf-8

  • utf-8 bytes -> read by something that expects the input to be Windows-1252, and so translates impossible bytes to "?"

  • the characters in converted back to bytes via windows-1252, and fed into your variable l.

Does this version of pydev give sys.stdin.encoding a decent value? And how does sys.stdin.encoding compare to the result of sys.getdefaultencoding()?

尘曦 2024-08-03 22:11:01

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

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

它在普通 Python 控制台中工作正常吗?

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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文