在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'
答案 0 :(得分: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()
的结果相比如何?
答案 1 :(得分:0)
我对输入编码不太确定,但我发现使用输出编码到tty流时,Python 2.x需要显式编码步骤,但Python 3.x则不需要。
因此,对于输入,您可能需要使用例如明确的解码步骤。 l.decode(sys.stdin.encoding)
。
在vanilla Python控制台中它能正常工作吗?