【问题标题】:How to handle my UnicodeDecodeError?如何处理我的 UnicodeDecodeError?
【发布时间】:2012-01-19 09:54:47
【问题描述】:

我的数据存储包含值,我希望我的表单能够更新这些值。我在 jinja2 中使用 wtforms 和谷歌应用引擎。我收到一条我无法理解的错误消息:

'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
Traceback (most recent call last):
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/handler.py", line 152, in dispatch
    response = super(NewBaseHandler, self).dispatch()
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/handler.py", line 101, in check_login
    return handler(self, *args, **kwargs)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/handler.py", line 881, in get
    self.render_jinja('details.html', **data)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/handler.py", line 119, in render_jinja
    **template_args))
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/webapp2_extras/jinja2.py", line 158, in render_template
    return self.environment.get_template(_filename).render(**context)
  File "/base/data/home/apps/s~bnano-www/wtform.356204665143172839/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "template_files/details.html", line 78, in top-level template code
    <dd> {{ form.address|safe }} </dd>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)

我的代码很普通:

class UpdateForm(Form):       
    address = TextField(_('Address'), [validators.Required()])
    zipcode = TextField(_('Zip code'), [validators.Required()])
    email = TextField(_('Email'), [validators.Required()])

class UpdateHandler(NewBaseHandler):

    @user_required
        def get(self):

        user = auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id']))

        userinfo = self.auth.get_user_by_session()
        if user.address:
            address = user.address#.decode('utf-8')
            logging.info('user info:'+str(userinfo))

        if user:
            data = {'user': user, 'address': address, 'form':UpdateForm(obj=user)}
            self.render_jinja('details.html', **data)

    @user_required
    def post(self, sponsor=None):
        user = \
            auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id'
                ]))
        user.address = UpdateForm(self.request.params).address.data
        user.put()
        self.render_jinja('details.html', user=user, sponsor=sponsor, form=UpdateForm(obj=user))

我想知道我可以做些什么来调整这个问题?任何帮助是极大的赞赏。

更新

在实验中我发现这样做可以处理错误: result.result_str = unicode(my_string_variable, "utf8") 我仍然想避免不得不操纵我使用的所有字符串。

已解决(?)

上次我检查没有出现问题。我怀疑这是我的测试数据是 latin-1 的问题,所以我清除了我的测试数据。感谢这里的所有帮助。

【问题讨论】:

  • result.result_str = unicode(my_string_variable, "utf8") :按照您的建议,解决了这个问题。非常感谢。被困了几个小时。

标签: python python-2.7 jinja2


【解决方案1】:

我也使用 GAE 和 Jinja2。我碰巧用西里尔符号发现了这个错误。 所以这 3 段代码帮助了我(我不想在代码中手动“.encode”我所有的字符串)。

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这是由 Richard Huang 指出的 https://stackoverflow.com/a/14919377/605952

【讨论】:

    【解决方案2】:

    是的,这是一个编码错误。我看到您已经尝试添加.decode('utf-8')。但是您是否尝试过对导致此类错误的字符串进行编码.encode('utf-8')

    【讨论】:

    • 感谢您的回答。它仍然无法正常工作。我尝试了一切,甚至根本不操作应该工作的字符串,从那时起它应该被视为 unicode。我怀疑 Jinja2 可能会导致这种情况,所以我会更仔细地研究它是如何处理 unicode 的。
    • 好的。您可以做的是打印(或以其他方式输出)您拥有的字符串类型,例如print 'user.adress =', type(user.address)。对您拥有的所有琴弦执行此操作,并确保它们相同。不要混用 unicode 和 none unicode...
    • 谢谢!它说user.adress = &lt;type 'str'&gt;,而我认为它应该说user.adress = &lt;type 'unicode'&gt;。我的输入有问题吗?我做错了什么?
    • 对不起。不知道我是否可以为您提供更多帮助,因为我不知道 jinja2 :-/ 只是想确保您知道在字符串前面加上 u 使其成为这样的 unicode:a_string = u'some random text'。如果您在不这样做的情况下混入我们自己的字符串(不是从表单中获取的),则可能是问题所在。但是从您向我们展示的代码 sn-p 来看,您似乎没有这样做。我想你可能已经知道了。我希望其他人能够让你更进一步......
    • 哦。好的,听起来很有道理。那么祝你好运:-)
    猜你喜欢
    • 2020-09-07
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多