2011-03-05 72 views
-1

嗨,你能不能幫我解碼此消息,並做什麼:我如何理解這個python錯誤信息?

main.py", line 1278, in post 
    message.body = "%s %s/%s/%s" % (msg, host, ad.key().id(), slugify(ad.title.encode('utf-8'))) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128) 

由於已經試圖消除編碼

更新調用它似乎工作:

class Recommend(webapp.RequestHandler): 
    def post(self, key): 
     ad= db.get(db.Key(key)) 
     email = self.request.POST['tip_email']  
     host = os.environ.get("HTTP_HOST", os.environ["SERVER_NAME"]) 
     senderemail = users.get_current_user().email() if users.get_current_user() else '[email protected]' if host.endswith('.cl') else '[email protected]' if host.endswith('.mx') else '[email protected]' if host.endswith('.br') else '[email protected]' 
     message = mail.EmailMessage(sender=senderemail, subject="%s recommends %s" % (self.request.POST['tip_name'], ad.title)) 
     message.to = email 
     message.body = "%s %s/%s/%s" % (self.request.POST['tip_msg'],host,ad.key().id(),slugify(ad.title)) 
     message.send() 
     matched_images=ad.matched_images 
     count = matched_images.count() 
     if ad.text: 
      p = re.compile(r'(www[^ ]*|http://[^ ]*)') 
      text = p.sub(r'<a href="http://\1" rel="nofollow">\1</a>',ad.text.replace('http://','')) 
     else: 
      text = None 
     self.response.out.write("Message sent<br>") 
     path = os.path.join(os.path.dirname(__file__), 'market', 'market_ad_detail.html') 
     self.response.out.write(template.render(path, {'user_url':users.create_logout_url(self.request.uri) if users.get_current_user() else users.create_login_url(self.request.uri), 
     'user':users.get_current_user(), 'ad.user':ad.user,'count':count, 'ad':ad, 'matched_images': matched_images,})) 
+1

[UnicodeEncodeError:'ascii'編解碼器無法編碼字符u'\ xa3']的可能重複(http://stackoverflow.com/questions/3588083/unicodeencodeerror-ascii-codec-cant-encode-character-u -xa3) – hop 2011-03-05 16:58:02

+2

如果您在SO上搜索該錯誤,您將獲得頁面和頁面以及頁面和頁面以及頁面和問題和答案頁面 – hop 2011-03-05 16:58:45

+0

感謝信息工作者 – 2011-03-05 17:10:43

回答

1

腳本這裏的問題是你的底層模型(message.body)只希望ASCII文本,但你想給它以Unicode編碼的字符串。

但是既然你在這裏有一個正常的ASCII字符串,你可以讓python打印'?'字符,當你有一個非ascii打印字符串。

"UNICODE STRING".encode('ascii','replace').decode('ascii') 

所以像你上面的例子:在具有Unicode字符變量

message.body = "%s %s/%s/%s" % \ 
    (msgencode('ascii','replace').decode('ascii'), 
    hostencode('ascii','replace').decode('ascii'), 
    ad.key().id()encode('ascii','replace').decode('ascii'), 
    slugify(ad.title)encode('ascii','replace').decode('ascii')) 

或者只是編碼/解碼。

但這不是最佳解決方案。最好的想法是使message.body成爲unicode字符串。因爲這似乎不可行(我對GAE不熟悉),您可以使用它至少不會有錯誤。

+0

好!我這樣做。非常感謝您的調查。 – 2011-03-06 06:12:12

+1

是的,這是完全可行的 - 只需使用db.StringProperty或db.TextProperty即可。你真的不應該只用問號來代替所有的unicode角色 - 我們生活在20世紀。人們使用unicode。 – 2011-03-08 00:22:08

1

你有一個Unicode字符在你不應該的地方。大多數情況下,我發現這個錯誤是MS Word風格傾斜的引號。

+0

在代碼或輸入中?我想你的意思是在代碼中。 – 2011-03-05 17:11:59

1

其中一個字段有一些字符無法編碼。如果切換到python 3(它具有更好的unicode支持),或者更改整個腳本的編碼,問題應該停止,關於在2.x中更改編碼的最佳方法是使用編碼註釋行。如果你看到http://evanjones.ca/python-utf8.html,你會看到更多關於使用python和utf-8支持的解釋,最好的建議是將# -*- coding: utf-8 -*-添加到腳本的頂部。而處理這樣

s = "hello normal string" 
u = unicode(s, "utf-8") 
backToBytes = u.encode("utf-8") 
+1

不幸的是,GAE [不支持Python 3](http://code.google.com/p/googleappengine/issues/detail?id=909)。 – 2011-03-05 17:31:42

+0

我注意到了GAE的問題,但我不想改變我的答案。 – 2011-03-05 17:32:38

+1

unicode字符實際上在源代碼中是不太可能的,因此設置源文件的編碼絕對沒有任何幫助。這個問題幾乎肯定是由於用戶使用utf-8輸入引起的,並將其粘貼到「str」而不是強制爲「unicode」。 – geoffspear 2011-03-05 18:17:51

0

我在使用Django norel和Google App Engine時遇到了類似的問題。

問題在於包含該應用程序的文件夾。可能這不是這個問題中描述的問題,但是,也許可以幫助別人像我一樣不浪費時間。

嘗試先將應用程序文件夾更改爲/ home /並嘗試再次運行,如果不起作用,請嘗試更多。