【问题标题】:Python: UnicodeEncodeError when reading from stdinPython:从标准输入读取时出现 UnicodeEncodeError
【发布时间】:2010-03-18 06:36:30
【问题描述】:

运行从标准输入读取的 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()

【问题讨论】:

  • 请注意,正确用 TeX 以外的任何东西解析 TeX 几乎是不可能的。
  • PEP 8 推荐(以及大多数 Python 内容)小写的模块和包名称。 LatexLexerLatexParser 不在一个包中,这对我来说也很奇怪。
  • 是的,但我只需要一个子集(LyX 的输出),并且我正在将现有的解析器从 Yappy 移植到 ANTLR。顺便说一句,antlr 从语法名称生成大写名称。 Java 约定....

标签: python unicode antlr stdin


【解决方案1】:

问题是,当从标准输入读取时,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) 

有用。

【讨论】:

    【解决方案2】:

    您没有在输入时收到此错误,而是在尝试输出读取的数据时收到此错误。您应该对读取的数据进行解码,并将 unicodes 扔掉,而不是一直处理字节串。

    【讨论】:

      【解决方案3】:

      这里有一篇关于 Python 如何处理编码的精彩文章:

      How to use UTF-8 with Python

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        相关资源
        最近更新 更多