的Python:从标准

问题描述:

读取数据时运行的Python程序,从标准输入读取时UnicodeEncodeError,我得到以下错误:的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() 
+0

什么是你输入的代码? – kennytm 2010-03-18 06:38:03

+0

我在上面添加了它.... – hansfbaier 2010-03-18 06:54:49

+0

请注意*正确*解析TeX与除TeX之外的其他任何东西都将是不可能的。 – 2010-03-18 07:06:41

的问题是,从标准输入读取数据时,蟒蛇使用系统默认的编码进行解码 :

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

BTW#2:对于字符串我发现

a_string.encode(encoding) 

有用。

您在输入时没有收到此错误,您在尝试输出读取数据时遇到此错误。您应该解码您读取的数据,并且将这些unicodes放在周围,而不是一直处理字节串。

+0

是的,但我在这里处理外国代码 – hansfbaier 2010-03-20 02:23:35

下面是关于Python如何处理编码一个很好的减记:

How to use UTF-8 with Python