1

Eclipse-pydevコンソールで一見ランダムな文字のマングリングに遭遇しました。特定の文字がstdoutから「\xd0?」として読み取られます。(最初のバイトは正しい、2番目の「?」)

これに対する解決策はありますか?

(PyDEV 1.4.6、Python 2.6、コンソールエンコーディング-継承されたUTF-8、Eclipse 3.5、UKロケールの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

このバージョンのpydevsys.stdin.encodingはまともな価値を与えますか?そして、の結果とどのようにsys.stdin.encoding比較しsys.getdefaultencoding()ますか?

于 2009-07-27T17:15:26.327 に答える
0

入力エンコーディングについてはよくわかりませんが、ttyストリームへの出力エンコーディングでは、Python 2.xには明示的なエンコーディング手順が必要でしたが、Python3.xには必要ないことがわかりました。

したがって、入力には、たとえばを使用した明示的なデコード手順が必要になる場合がありますl.decode(sys.stdin.encoding)

バニラPythonコンソールで問題なく動作しますか?

于 2009-07-27T14:31:48.667 に答える