2010-03-18 12 views
6

Uruchamiając program Pythona, który wczyta ze standardowego wejścia, pojawia się następujący błąd:Python: UnicodeEncodeError podczas odczytu z stdin

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

Jak mogę to naprawić?

Uwaga: Ten błąd występuje wewnętrzny do antlr a linia wygląda tak:

 self.strdata = unicode(data) 

Ponieważ nie chcę, aby zmodyfikować kod źródłowy, Chciałbym przejść w coś, co jest dopuszczalne .

Kod wejściowy wygląda tak:

#!/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

Jaki jest Twój kod do wejścia? – kennytm

+0

Dodałem go powyżej .... – hansfbaier

+0

Zauważ, że * poprawnie * parsowanie TeX-a z czymkolwiek oprócz TeX-a będzie niemożliwe. –

Odpowiedz

14

Problem polega na tym, że gdy czyta ze standardowego wejścia, pyton dekoduje go przy użyciu domyślnego systemu kodowania:

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

wejście jest bardzo prawdopodobne UTF-8 lub Windows-CP-1252, więc program dławi znaki spoza zestawu ASCII.

Aby przekonwertować sys.stdin do strumienia z właściwego dekodera, użyłem:

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

Ten problem został rozwiązany.

BTW, jest to metoda ANTLRs FileStream korzysta otworzyć plik z danego pliku (zamiast danego strumienia):

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

BTW nr 2: Na strunach znalazłem

a_string.encode(encoding) 

przydatne.

1

Nie otrzymujesz tego błędu na wejściu, pojawia się ten błąd podczas próby wyprowadzenia odczytanych danych. Powinieneś dekodować dane, które czytasz, i wyrzucać unicody, zamiast zajmować się bajtami przez cały czas.

+0

Tak, ale mam tutaj do czynienia z obcym kodem – hansfbaier

Powiązane problemy