2009-07-03 13 views
1

Je rencontre des problèmes avec la conversion d'une chaîne UTF-8 en Unicode. J'ai l'erreur.Python Unicode UnicodeEncodeError

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

J'ai essayé envelopper cela dans un bloc try/except mais Google me donne une erreur d'administrateur système qui était une ligne. Quelqu'un peut-il suggérer comment attraper cette erreur et continuer?

Cheers, John.

- ERREUR COMPLET -

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) 

Répondre

8

Le solution correct est de faire ce qui suit:

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

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

+0

Le commentaire ci-dessus est le code correct. Toutes mes excuses pour ne pas avoir posé la question correctement, je ne suis pas exactement à 100% quel type de données j'ai et donc le code d'erreur complet. Merci pour votre aide Alex. Cela devrait corriger l'erreur d'URL pour www.hurl.ws –

+0

@John, bien si vous voulez rediriger alors vous voulez rediriger, je montrais juste comment encoder et citer correctement une URL Unicode générique ;-). Comme une curiosité, pourquoi avez-vous accepté cela (merci!), Mais ne l'a pas remis en cause? C'est particulier par l'étiquette SO ...! -) –

-1

Essayez ceci:

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

Désolé que le travail na pas. Ceci est mon code actuel. Parce que j'appelle self.redirect la chaîne est encodée et provoque l'erreur parce que dans ce cas l'URL a en fait un "å" dedans. Si cette erreur se produit, alors j'écris l'URL à la page, et en utilisant la balise META-REFRESH, je fais le navigateur faire la redirection après quelques secondes self.redirect (url.long_url) –

+0

@zdmytriv: unicode (absolute_url)? Ne devrait pas UTF-8 obtenir une mention quelque part? –

+0

Fixé devrait fonctionner maintenant – zinovii

1

S'il vous plaît modifier ce désordre afin qu'il soit lisible. Astuce: utilisez le "bloc de code" (bouton 101010 thingy).

Vous dites que vous "essayez de convertir une chaîne UTF-8 en unicode" mais str(absolute_url) est une façon étrange de faire. Êtes-vous sûr que absolute_url est UTF-8? Essayez

print type(absolute_url) 
print repr(absolute_url) 

Si elle est UTF-8, vous avez besoin absolute_url.decode('utf8')

4

L'en-tête de l'emplacement que vous essayez de définir les besoins d'être une URL, et une URL doit être en Ascii. Puisque votre Url n'est pas une chaîne Ascii, vous obtenez l'erreur. Juste attraper l'erreur ne aidera pas puisque l'en-tête de lieu ne fonctionnera pas avec une URL non valide. Lorsque vous créez absolute_url vous devez vous assurer qu'il est correctement codé, mieux en utilisant urllib.quote et la méthode de chaînes encode(). Vous pouvez essayer ceci:

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