2010-03-25 37 views
14

Tôi đang làm việc thông qua dự án đọc RSS Django here.Mã hóa cho codec "ascii 'không thể mã hóa ký tự ... thứ tự không nằm trong phạm vi (128)"

Nguồn cấp dữ liệu RSS sẽ đọc nội dung như "OKLAHOMA CITY (AP) - James Harden cho phép". Mã hóa của nguồn cấp dữ liệu RSS đọc mã hóa = "UTF-8" vì vậy tôi tin rằng tôi đang chuyển utf-8 để đánh dấu trong đoạn mã bên dưới. Các dấu gạch ngang em là nơi nó cuộn cảm.

Tôi nhận được lỗi Django của "'ascii' codec không thể mã hóa ký tự u '\ u2014' ở vị trí 109: thứ tự không nằm trong phạm vi (128)" là UnicodeEncodeError. Trong các biến được chuyển, tôi thấy "James Harden" OKLAHOMA CITY (AP) \ u2014. Dòng mã không hoạt động là:

content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 

Tôi đang sử dụng markdown 2.0, django 1.1 và python 2.4.

Trình tự mã hóa và giải mã ma thuật mà tôi cần làm để thực hiện công việc này là gì?


(Để đối phó với yêu cầu Prometheus'. Tôi đồng ý các định dạng giúp)

Vì vậy, trong quan điểm nào để thêm một dòng smart_unicode trên dòng mã hóa parsed_feed ...

content = smart_unicode(content, encoding='utf-8', strings_only=False, errors='strict') 
content = content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 

này đẩy vấn đề với models.py của tôi đối với tôi nơi tôi có

def save(self, force_insert=False, force_update=False): 
    if self.excerpt: 
     self.excerpt_html = markdown(self.excerpt) 
     # super save after this 

Nếu tôi thay đổi phương thức lưu. ..

def save(self, force_insert=False, force_update=False): 
    if self.excerpt: 
     encoded_excerpt_html = (self.excerpt).encode('utf-8') 
     self.excerpt_html = markdown(encoded_excerpt_html) 

tôi nhận được lỗi " 'ascii' giải mã không thể giải mã byte 0xe2 ở vị trí 141: thứ tự không trong phạm vi (128)" vì bây giờ nó đọc "\ xe2 \ x80 \ x94" nơi gạch đầu là

+0

bạn có thể xin vui lòng gửi traceback như hiện trạng không? – tzot

+0

Về cơ bản, giá trị của 'parsed_feed.encoding' là gì? Có phải 'ascii', mỗi cơ hội? (điều đó sẽ giải thích cả hai lỗi của bạn). – tzot

Trả lời

4
+1

Sử dụng ... content = smart_unicode (nội dung, mã hóa = 'utf-8', strings_only = False, errors = 'strict') content = content = content.encode (parsed_feed.encoding, "xmlcharrefreplace") đẩy vấn đề với models.py của tôi cho tôi nơi tôi có def save (self, force_insert = False, force_update = False): nếu self.excerpt: self.excerpt_html = markdown (self.excerpt) # super save after this Nếu tôi thay đổi phương pháp tiết kiệm để có encoded_excerpt_html = (self.excerpt) .encode ('utf-8') self.excerpt_html = markdown (encoded_excerpt_html) – user140314

+0

Phần 2: tôi nhận được lỗi " 'ascii' codec không thể giải mã byte 0xe2 ở vị trí 141: thứ tự không nằm trong phạm vi (128) "vì bây giờ nó đọc" \ xe2 \ x80 \ x94 "trong đó dấu gạch ngang em là. – user140314

+0

Bạn có thể sửa đổi bài viết gốc của mình bằng cách ở trên không? Rất khó đọc mà không có định dạng phù hợp. – nikola

12

Nếu dữ liệu mà bạn đang nhận được, trên thực tế, được mã hóa bằng UTF-8, thì nó phải là một chuỗi các byte - một đối tượng 'str' của Python, trong Python 2.X

Bạn có thể xác minh điều này bằng xác nhận:

assert isinstance(content, str) 

Khi bạn biết điều đó đúng, bạn có thể chuyển sang chế độ mã hóa thực tế. Ví dụ, Python không thực hiện chuyển mã - ví dụ: trực tiếp từ UTF-8 sang ASCII. Bạn cần phải lần đầu tiên bật chuỗi lại byte vào một chuỗi Unicode, bằng cách giải mã nó:

unicode_content = content.decode('utf-8') 

(Nếu bạn có thể tin tưởng parsed_feed.encoding, sau đó sử dụng thay cho đen 'utf-8' Dù bằng cách nào,. được chuẩn bị cho các lỗi.)

Sau đó bạn có thể mất chuỗi, và mã hóa nó trong ASCII, thay thế nhân vật cao với các khoản tương đương thực thể XML của họ:

xml_content = unicode_content.encode('ascii', 'xmlcharrefreplace') 

Phương pháp đầy đủ, sau đó, sẽ trông somthing như thế này:

try: 
    content = content.decode(parsed_feed.encoding).encode('ascii', 'xmlcharrefreplace') 
except UnicodeDecodeError: 
    # Couldn't decode the incoming string -- possibly not encoded in utf-8 
    # Do something here to report the error 
0

Tôi gặp lỗi này trong khi ghi tên tệp bằng tệp zip. Sau đây thất bại

ZipFile.write(root+'/%s'%file, newRoot + '/%s'%file) 

và sau làm việc

ZipFile.write(str(root+'/%s'%file), str(newRoot + '/%s'%file)) 
+3

Gọi 'str()' trên một giá trị unicode với các ký tự không phải ASCII sẽ dẫn đến lỗi chính xác mà OP đang nhìn thấy. –

+0

@MartijnPieters: Xin chào, đó là một điểm rất quan trọng mà bạn thực hiện. Tôi có thể tìm thấy không có tham chiếu đến những gì 'str()' thực sự đang làm trong [hướng dẫn sử dụng tốt] (http://docs.python.org/2/library/functions.html#str) tuy nhiên tôi thuộc tính đó với tôi là một Python noob hơn một lỗi của sổ tay. Đây là tài liệu này, những gì chính xác là 'str()' làm cho đối số, và chính xác những gì 'str()' trở lại? Cảm ơn! – dotancohen

+0

'str()' trả về một chuỗi * * *; ký tự có giá trị từ 0 đến 255, với 0-127 thường được diễn giải và hiển thị dưới dạng ký tự ASCII. Mặt khác, giá trị 'unicode()' có thể đại diện cho bất kỳ điểm mã nào trong tiêu chuẩn Unicode, giữa 0 và 1114111. Vì vậy, sử dụng 'str (unicodevalue)' để biến unicode thành chuỗi byte sẽ liên quan đến * some * transformation . –

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