2010-03-18 41 views
6

Khi chạy một chương trình Python mà đọc từ stdin, tôi nhận được lỗi sau:Python: UnicodeEncodeError khi đọc từ stdin

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

Làm thế nào tôi có thể sửa chữa nó?

Lưu ý: Lỗi này xảy ra nội bộ để ANTLR và dòng trông như thế:

 self.strdata = unicode(data) 

Vì tôi không muốn thay đổi mã nguồn, Tôi muốn vượt qua trong một cái gì đó có thể chấp nhận .

Mã đầu vào trông như thế:

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

mã của bạn cho đầu vào là gì? – kennytm

+0

Tôi đã thêm nó ở trên .... – hansfbaier

+0

Lưu ý rằng * đúng cách * phân tích cú pháp TeX với bất kỳ điều gì nhưng TeX sẽ không thể tiếp cận được. –

Trả lời

14

Vấn đề là, khi đọc từ stdin, python giải mã nó bằng cách sử dụng mã hóa mặc định hệ thống:

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

Đầu vào là rất có khả năng UTF-8 hoặc Windows-CP-1252, do đó chương trình cuộn cảm trên các ký tự không phải ASCII.

Để chuyển đổi sys.stdin đến một dòng suối với bộ giải mã thích hợp, tôi đã sử dụng:

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

Đó khắc phục vấn đề.

BTW, đây là phương pháp ANTLRs FileStream sử dụng để mở một tập tin với tên tập tin nhất định (thay vì một dòng nhất định):

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

BTW # 2: Đối với dây tôi thấy

a_string.encode(encoding) 

hữu ích.

1

Bạn không nhận được lỗi này khi nhập, bạn sẽ gặp phải lỗi này khi cố gắng xuất dữ liệu đã đọc. Bạn nên giải mã dữ liệu bạn đọc, và ném unicodes xung quanh thay vì đối phó với bytestrings toàn bộ thời gian.

+0

Có, nhưng tôi đang xử lý mã nước ngoài tại đây – hansfbaier

Các vấn đề liên quan