Wie löst ein UnicodeDecodeError?

Bekomme ich eine seltsame Fehlermeldung, wenn Sie versuchen zu Lesen, die nicht-ascii-Zeichen aus dem datastore:

'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)
Traceback (most recent call last):
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 127, in dispatch
    response = super(NewBaseHandler, self).dispatch()
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 73, in check_login
    return handler(self, *args, **kwargs)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 526, in get
    user=user)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/handler.py", line 91, in render_jinja
    **template_args))
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/webapp2_extras/jinja2.py", line 158, in render_template
    return self.environment.get_template(_filename).render(**context)
  File "/base/data/home/apps/s~myapp-www/events.355951895377615944/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "template_files/my_organization.html", line 148, in top-level template code
    <li id="{{ person.key.id()|makeid }}" class="level_1 inactive   leaf"><a href="" style="" class=""><ins>&nbsp;</ins><table class="leaf_info"><tbody>    <tr><td class="name">{{ person.firstname }} {{ person.lastname}} {{person.key.id()|makeid}}</td><td class="level" title="New Distributor"><span class="level_parseable">1</span>1</td><td class="downlines">0</td><td class="cc_personal"><span class="cc_personal_parseable"></span>0</td><td class="cc_downlines"><span class="cc_downlines_parseable"></span>0</td><td class="cc_activity"><span class="cc_activity_parseable"></span>0</td><td class="cc_nonmanager"><span class="cc_nonmanager_parseable"></span>0</td><td class="cc_total"><span class="cc_total_parseable"></span>0</td></tr></tbody></table></a></li>{% endfor %}
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)

Die Schleife, die verwendet wird, um zu arbeiten, ist alltäglich:

{% for person in people %}
    <li id="{{ person.key.id()|makeid }}" class="level_1 inactive   leaf">
<a href="" style="" class=""><ins>&nbsp;</ins><table class="leaf_info"><tbody>  <tr><td class="name">{{ person.firstname }} {{ person.lastname}} {{person.key.id()|makeid}}</td><td class="level" title="New Distributor"><span class="level_parseable">1</span>1</td><td class="downlines">0</td><td class="cc_personal"><span class="cc_personal_parseable"></span>0</td><td class="cc_downlines"><span class="cc_downlines_parseable"></span>0</td><td class="cc_activity"><span class="cc_activity_parseable"></span>0</td><td class="cc_nonmanager"><span class="cc_nonmanager_parseable"></span>0</td><td class="cc_total"><span class="cc_total_parseable"></span>0</td></tr></tbody></table></a></li>
{% endfor %}

Was kann ich tun um diesen Fehler zu beheben?

Mein handler sieht so aus

class Myorg(NewBaseHandler):
    @user_required
    def get(self):
        user = auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id']))
        people = auth_models.User.query(auth_models.User.sponsor == user.key).fetch()
        self.render_jinja('my_organization.html', people=people,
                              user=user)

Und meine Modell-definition ist das Benutzer-Modell von webapp2. Hier ist auch meine custom-filer makeid:

def makeid(n, countrycode="46"):
    countrycode = str(countrycode)
    n = str(n)
    return "%s%s%s" % (countrycode, '0'*(12-len(countrycode)-len(n)), n)

Update

Die Problemumgehung ist seltsam, ich habe gerade eine .decode('utf-8') was sollten Sie nicht tun müssen:

class UpdateHandler(NewBaseHandler):

    @user_required
    def get(self):
        user = \
            auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id'
                ]))
        sponsor = None
        if user.sponsor:
            sponsor = user.sponsor.get()
        address = None
        if user.address:
            address = user.address.decode('utf-8')
        if user.city:
            city = user.city.decode('utf-8')
        self.render_jinja('details.html', city=city, user=user, address=address, sponsor=sponsor, form=UpdateForm(obj=user))

Gibt es eine Weise zu decodieren, die alle Variablen der Benutzer-Objekt auf einmal statt eins nach dem anderen?

  • Finden Sie die Datenbank-Einträge mit 0xC3, oder generell alle high-bit-Zeichen; und/oder korrigieren Sie den code zu akzeptieren, die Codierung, die Sie haben in Ihrer Datenbank. FWIW 0xC3 ist à in Latin-1, wenn das, was Sie haben, oder es könnte sein, das erste Zeichen in utf-8-Sequenz.
  • Ich kann sagen, dass ich wahrscheinlich nicht gespeicherte Ã. Danke für den Kommentar, aber mein code sollte in der Lage, das format aus dem datastore (google app engine) und es gibt sehr wenig code, außer für die Vorlage. Da der Fehler tritt nur auf Produktion, die ich auch schließen, dass es hat etwas zu tun mit dem, was gelesen wird aus dem datastore-D. H. der Inhalt der Liste benannten Personen und übergeben wird mehr oder weniger direkt aus dem datastore mit einer Abfrage in python people = auth_models.User.query(auth_models.User.sponsor == user.key).fetch() Was passiert, wenn es eine UTF8-Sequenz?
  • Können Sie zeigen die __unicode__ Methode von Ihrem Modell? Ich vermute ein Fehler...
  • Die Modell-definition ist das Benutzer-Modell von webapp2 ie webapp-improved.appspot.com/api/webapp2_extras/appengine/auth/...
  • Können Sie Ihre benutzerdefinierten filter "makeid" definition zu?
Schreibe einen Kommentar