Python:从stdin读取时的UnicodeEncodeError

时间:2010-03-18 06:36:31

标签: python unicode antlr stdin

当运行从stdin读取的Python程序时,我收到以下错误:

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 个答案:

答案 0 :(得分:14)

问题是,从stdin读取时,python解码 它使用系统默认编码:

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

输入很可能是UTF-8或Windows-CP-1252,所以该程序 非ASCII字符的扼流圈。

为了使用正确的解码器将sys.stdin转换为流,我使用了:

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

解决了这个问题。

BTW,这是ANTLRs FileStream用来打开文件的方法 使用给定的文件名(而不是给定的流):

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

BTW#2:对于我找到的字符串

a_string.encode(encoding) 

有用的。

答案 1 :(得分:1)

您在输入时没有收到此错误,在尝试输出读取数据时出现此错误。你应该解码你读取的数据,然后抛出unicodes,而不是一直处理字节串。

答案 2 :(得分:1)

这是关于Python如何处理编码的优秀减记:

How to use UTF-8 with Python