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> </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> </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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Sie versuchen zu interpolieren, eine raw - (byte -) Strings in einen Unicode-Vorlage. Dies geschieht, indem Sie versuchen zu Dekodieren des raw-string in unicode mit einigen Codierung - hier werden die Standard - 'ascii' - Kodierung, die scheitern, weil es die Begegnung mit einem codepoint, der nicht gültig für ASCII.
Um dies zu beheben, muss man nur die unicode-Zeichenfolgen in Ihre Vorlage - decodieren der Zeichenfolge den richtigen codec verwenden, bevor Sie es.
{{person.firstname}}
Iteration über die Ergebnisse einer Abfrage.War das beste ist, um die Zeichenfolge konvertiert ASCII-Zeichensatz. Sie können die python Kodieren cgi-Funktion zum konvertieren von ASCII -
Beispiel
Besetzung text/HTML übergeben Sie der Vorlage Unicode und Sie sollten es Weg. Hatte dieses problem vor mit Django-templates im SPIEL mit webapp2.