Python: UnicodeEncodeError при чтении из стандартного ввода - PullRequest
6 голосов
/ 18 марта 2010

При запуске программы на 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()

Ответы [ 3 ]

14 голосов
/ 18 марта 2010

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

>>> 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()

КСТАТИ # 2: Для строк я нашел

a_string.encode(encoding) 

полезно.

1 голос
/ 18 марта 2011

Вот превосходное описание того, как Python обрабатывает кодировки:

Как использовать UTF-8 с Python

1 голос
/ 18 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...