2010-03-18 5 views
6

При запуске программы на Python, который читает из стандартного ввода, я получаю следующее сообщение об ошибке:Python: UnicodeEncodeError при чтении из стандартного ввода

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

+0

Я добавил его выше .... – hansfbaier

+0

Обратите внимание, что * правильно * разбор TeX с чем-либо, кроме TeX, будет почти невозможным. –

ответ

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

Вы не получаете эту ошибку на входе, вы получаете эту ошибку при попытке вывода прочитанных данных. Вы должны декодировать данные, которые вы читаете, и бросать юникоды вокруг, вместо того чтобы иметь дело с bytestrings все время.

+0

Да, но я имею дело с иностранным кодом здесь – hansfbaier

Смежные вопросы