2009-07-03 3 views
1

Ich habe Probleme mit dem Versuch, eine UTF-8-Zeichenfolge in Unicode zu konvertieren. Ich bekomme den Fehler.Python Unicode UnicodeEncodeError

UnicodeEncodeError: 'ascii' codec can't encode characters in position 73-75: ordinal not in range(128) 

Ich habe versucht, dies in einem Block try/except Einwickeln aber dann einen Systemadministrator Fehler google gab mir die eine Zeile war. Kann jemand vorschlagen, wie man diesen Fehler fängt und fortfährt.

Prost, John.

- FULL ERROR -

Traceback (most recent call last): 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 501, in __call__ 
    handler.get(*groups) 
    File "/Users/johnb/Sites/hurl/hurl.py", line 153, in get 
    self.redirect(url.long_url) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 371, in redirect 
    self.response.headers['Location'] = str(absolute_url) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 73-75: ordinal not in range(128) 

Antwort

8

Die richtige solution ist folgendes zu tun:

self.response.headers['Location'] = urllib.quote(absolute_url.encode("utf-8")) 
+0

self.redirect (absolute_url.encode ('utf-8')) –

+0

Der obige Kommentar ist der korrekte Code. Entschuldigung dafür, dass ich die Frage nicht richtig gestellt habe, ich bin nicht 100% genau, welche Art von Daten ich habe und daher voller Fehlercode. Danke für dich Hilfe Alex. Dies sollte URL-Fehler für www.hurl.ws –

+0

@John, gut, wenn Sie umleiten möchten, dann möchten Sie Redirect, ich zeigte nur, wie man eine generische Unicode-URL richtig codieren und zitieren ;-). Als Kuriosum, warum hast du das akzeptiert (danke!), Aber nicht aufgewertet? Das ist typisch für SO Etikette ...! -) –

-1

Try this:

self.response.headers['Location'] = absolute_url.decode("utf-8") 
or 
self.response.headers['Location'] = unicode(absolute_url, "utf-8") 
+0

Sorry, dass nicht funktioniert hat. Dies ist mein aktueller Code. Da ich self.redirect anrufe, wird der String verschlüsselt und verursacht den Fehler, weil in diesem Fall die URL tatsächlich ein "å" enthält. Wenn dieser Fehler auftritt, schreibe ich die URL zu Seite, und mit dem META-REFRESH-Tag, mache ich den Browser die Umleitung nach ein paar Sekunden Self.redirect (url.long_url) –

+0

@ zdmytriv: Unicode (absolute_url)? Sollte UTF-8 nicht irgendwo erwähnt werden? –

+0

Fixed sollte nun funktionieren – zinovii

1

bearbeiten Sie bitte, dass Chaos, so dass es lesbar ist. Tipp: Verwenden Sie den "Codeblock" (101010-Thingy-Button).

Sie sagen, dass Sie "versuchen, eine UTF-8-Zeichenfolge in Unicode zu konvertieren", aber str(absolute_url) ist eine seltsame Art und Weise, darüber zu gehen. Sind Sie sicher, dass absolute_url UTF-8 ist? Versuchen

print type(absolute_url) 
print repr(absolute_url) 

Wenn es ist UTF-8, die Sie benötigen absolute_url.decode('utf8')

4

Location-Header Sie versuchen, Bedürfnisse zu setzen eine URL sein, und eine URL muss in Ascii sein. Da Ihre URL keine ASCII-Zeichenfolge ist, erhalten Sie den Fehler. Das Abfangen des Fehlers hilft nicht, da der Location-Header nicht mit einer ungültigen URL funktioniert.

Wenn Sie absolute_url erstellen, müssen Sie sicherstellen, dass es richtig codiert ist, am besten mit urllib.quote und die Strings encode() Methode. Sie können dies versuchen:

self.response.headers['Location'] = urllib.quote(absolute_url.encode('utf-8'))