2010-03-18 7 views
6

Wenn ein Python-Programm ausgeführt wird, die von stdin liest, erhalte ich folgende Fehlermeldung:Python: UnicodeEncodeError beim Lesen von stdin

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

Wie kann ich es beheben?

Hinweis: Der Fehler tritt auf interne antlr und die Zeile sieht wie folgt aus:

 self.strdata = unicode(data) 

Da will ich nicht den Quellcode ändern, Ich mag würde in etwas zu übergeben, die akzeptabel ist .

Der Eingangs Code sieht wie folgt aus:

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

Was ist Ihr Code für die Eingabe? – kennytm

+0

Ich habe es oben hinzugefügt .... – hansfbaier

+0

Beachten Sie, dass * richtig * TeX mit etwas außer TeX zu analysieren, wird fast unmöglich sein. –

Antwort

14

Das Problem ist, dass, wenn sie von stdin lesen, Python decodiert es das System Standard-Kodierung verwendet:

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

Der Eingang ist sehr wahrscheinlich, UTF-8 oder Windows-CP-1252, so drosselt das Programm auf Nicht-ASCII-Zeichen.

Um sys.stdin zu einem Strom mit der richtigen Decoder zu konvertieren, habe ich:

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

, dass das Problem behoben.

BTW, ist dies die Methode ANTLRs Filestream eine Datei mit bestimmten Dateinamen zu öffnen verwendet (anstelle eines gegebenen Stream):

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

BTW 2 #: Für Strings I

a_string.encode(encoding) 
gefunden

nützlich.

1

Sie erhalten diesen Fehler bei der Eingabe nicht, Sie erhalten diesen Fehler, wenn Sie versuchen, die gelesenen Daten auszugeben. Sie sollten Daten entschlüsseln, die Sie lesen, und die Unicodes herumwerfen, anstatt die ganze Zeit mit Bytestrings zu arbeiten.

+0

Ja, aber ich habe hier mit fremdem Code zu tun – hansfbaier