Python: UnicodeEncodeError при чтении из stdin

При запущении программы 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()
6
задан hansfbaier 18 March 2010 в 06:55
поделиться

2 ответа

Проблема в том, что при чтении из стандартного ввода-вывода 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) 

полезным.

14
ответ дан 8 December 2019 в 14:42
поделиться

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

1
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: