При запущении программы Python, которая читает из stdin, я получаю следующую ошибку:
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()
Проблема в том, что при чтении из стандартного ввода-вывода python декодирует его, используя системную кодировку по умолчанию:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
Вход очень вероятно UTF-8 или Windows-CP-1252, поэтому программа подавляется не-ASCII-символами.
Чтобы преобразовать sys.stdin в поток с соответствующим декодером, я использовал:
import codecs
char_stream = codecs.getreader("utf-8")(sys.stdin)
Это устранило проблему.
Кстати, это метод ANTLR, который FileStream использует для открытия файла с заданным именем файла (вместо заданного потока):
fp = codecs.open(fileName, 'rb', encoding)
try:
data = fp.read()
finally:
fp.close()
BTW # 2: Для строк я нашел
a_string.encode(encoding)
полезным.
Вы не получаете эту ошибку при вводе, вы получаете эту ошибку при попытке вывести считанные данные. Вы должны декодировать прочитанные данные и выводить юникоды, а не работать все время с байтовыми строками.