2010-03-18 16 views
6

Cuando se ejecuta un programa de Python que lee de la entrada estándar, me sale el siguiente error:Python: UnicodeEncodeError cuando se lee de la entrada estándar

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 320: ordinal not in range(128) 

¿Cómo puedo solucionarlo?

Nota: El error se produce interno para Antlr y la línea que se parece a:

 self.strdata = unicode(data) 

Ya que no desea modificar el código fuente, me gustaría pasar en algo que es aceptable .

El código de entrada se ve así:

#!/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

¿Cuál es su código para la entrada? – kennytm

+0

Lo agregué antes .... – hansfbaier

+0

Tenga en cuenta que * correctamente * analizar TeX con cualquier cosa que no sea TeX será casi imposible. –

Respuesta

14

El problema es que cuando se lee de la entrada estándar, pitón decodifica utilizando la codificación por defecto del sistema:

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

es muy probable que la entrada UTF-8 o Windows-CP-1252, por lo que el programa se ahoga en caracteres que no son ASCII.

Convertir sys.stdin a un arroyo con el decodificador adecuado, he utilizado:

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

que fijó el problema.

Por cierto, este es el método ANTLRs FileStream utiliza para abrir un archivo con nombre de archivo dado (en lugar de una corriente dada):

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

BTW # 2: Para las cadenas encontré

a_string.encode(encoding) 

útil.

1

No recibe este error en la entrada, está recibiendo este error cuando intenta dar salida a los datos leídos. Debería decodificar los datos que lee y arrojar los unicodes en lugar de ocuparse de las cadenas de bytes todo el tiempo.

+0

Sí, pero estoy tratando con código extranjero aquí – hansfbaier

Cuestiones relacionadas