2009-07-27 28 views
1

偶然發現了一些看似隨機字符重整在Eclipse的PyDev的控制檯:「?\ XD0」 特定的字符從標準輸出爲已讀(第一個字節是正確的,第二個「?」)日食的bizzare,PyDev的控制檯行爲

有一些解決這個?

(1.4.6的PyDev,Python 2.6中,控制檯編碼 - 繼承UTF-8,蝕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

我也遇到過這個。你有沒有在尋找修復方面取得進一步進展? – 2009-11-04 04:33:47

回答

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()的結果比較如何?

+0

非常plausable交代,感謝 sys.stdin.encoding == sys.getdefaultencoding()== 'UTF-8' – ymv 2009-07-27 18:50:18

0

我對輸入編碼不太確定,但我發現輸出編碼爲tty流時,Python 2.x需要顯式編碼步驟,但Python 3.x不需要。

因此,對於輸入您可能需要使用例如一個明確的解碼步l.decode(sys.stdin.encoding)

它在香草Python控制檯中工作正常嗎?