2010-03-18 44 views
6

讀取數據時運行的Python程序,從標準輸入讀取時UnicodeEncodeError,我得到以下錯誤:的Python:從標準

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 320: ordinal not in range(128) 

我怎樣才能解決呢?

注:發生內部ANTLR錯誤,併線看起來像這樣:

 self.strdata = unicode(data) 

因爲我不想修改源代碼, 我想的東西,是可以接受的通。

輸入的代碼看起來像這樣:

#!/usr/bin/python 
import sys 
import codecs 
import antlr3 
import antlr3.tree 
from LatexLexer import LatexLexer 
from LatexParser import LatexParser 


char_stream = antlr3.ANTLRInputStream(codecs.getreader("utf8")(sys.stdin)) 
lexer = LatexLexer(char_stream) 
tokens = antlr3.CommonTokenStream(lexer) 
parser = LatexParser(tokens) 
r = parser.document() 
+0

什麼是你輸入的代碼? – kennytm 2010-03-18 06:38:03

+0

我在上面添加了它.... – hansfbaier 2010-03-18 06:54:49

+0

請注意*正確*解析TeX與除TeX之外的其他任何東西都將是不可能的。 – 2010-03-18 07:06:41

回答

14

的問題是,從標準輸入讀取數據時,蟒蛇使用系統默認的編碼進行解碼 :

>>> import sys 
>>> sys.getdefaultencoding() 
'ascii' 

輸入很可能UTF-8或Windows-CP-1252,所以程序 扼流圈上非ASCII字符。

要sys.stdin轉換爲用適當的解碼器的流,我用:

import codecs 
char_stream = codecs.getreader("utf-8")(sys.stdin) 

這解決了這一問題。

順便說一句,這是ANTLRs的FileStream用來打開文件 與給定文件名(而不是一個給定的流)的方法:

fp = codecs.open(fileName, 'rb', encoding) 
    try: 
     data = fp.read() 
    finally: 
     fp.close() 

BTW#2:對於字符串我發現

a_string.encode(encoding) 

有用。

1

您在輸入時沒有收到此錯誤,您在嘗試輸出讀取數據時遇到此錯誤。您應該解碼您讀取的數據,並且將這些unicodes放在周圍,而不是一直處理字節串。

+0

是的,但我在這裏處理外國代碼 – hansfbaier 2010-03-20 02:23:35