我怎么能理解这个python错误信息?

时间:2011-03-05 16:39:21

标签: python google-app-engine

您可以帮我解码此消息以及该怎么做:

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)

由于

UPDATE尝试删除编码调用后似乎有效:

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 'info@monton.cl' if host.endswith('.cl') else 'info@monton.com.mx' if host.endswith('.mx') else 'info@montao.com.br' if host.endswith('.br') else 'admin@koolbusiness.com'
        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,}))

4 个答案:

答案 0 :(得分:1)

你在一个你不应该的地方有一个Unicode角色。我经常发现这个错误是MS字样倾斜的引号。

答案 1 :(得分:1)

其中一个字段包含一些无法编码的字符。如果你切换到python 3(它有更好的unicode支持),或者你改变整个脚本的编码问题应该停止,关于在2.x中更改编码的最佳方法是使用编码注释行。如果您看到http://evanjones.ca/python-utf8.html,您会看到更多关于使用带有utf-8支持的python的说明,最好的建议是将# -*- coding: utf-8 -*-添加到脚本的顶部。并处理这样的脚本

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

答案 2 :(得分:1)

这里的问题是你的底层模型(message.body)只想要ASCII文本,但是你试图给它一个用unicode编码的字符串。

但是既然你在这里有一个普通的ascii字符串,你可以将python打印出'?'你有一个非ascii打印字符串时的字符。

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

就像你上面的例子一样:

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

或者只对具有unicode字符的变量进行编码/解码。

但这不是最佳解决方案。最好的想法是使message.body成为一个unicode字符串。这似乎不可行(我不熟悉GAE),你可以使用它至少没有错误。

答案 3 :(得分:0)

使用Django norel和Google App Engine时遇到了类似的问题。

问题出在包含该应用程序的文件夹中。可能这不是这个问题中描述的问题,但是,也许可以帮助别人不浪费时间像我一样。

首先尝试将您的应用程序文件夹更改为/ home /并尝试再次运行,如果不起作用,请尝试更多内容。