python url unquote suivi d'un décode unicode
J'ai une chaîne unicode comme '%C3%A7%C3%B6asd+fjkls%25asd'
et je veux décoder cette chaîne.
J'ai utilisé urllib.unquote_plus(str)
mais il fonctionne mal.
- prévu :
çöasd+fjkls%asd
- résultat :
çöasd fjkls%asd
un double code, les caractères utf-8(%C3%A7
et %C3%B6
) sont décodés mal.
Ma version de python est de 2,7 sous une distribution linux.
Quelle est la meilleure façon d'obtenir le résultat escompté?
source d'informationauteur user637287
Vous devez vous connecter pour publier un commentaire.
Vous avez 3 ou 4 ou 5 problèmes ... mais
repr()
etunicodedata.name()
sont vos amis; ils sans ambiguïté de vous montrer exactement ce que vous avez obtenu, sans la confusion engendrée par des personnes avec différents console codages de communiquer les résultats deprint fubar
.Résumé: soit (un) vous commencez avec un objet unicode et d'appliquer la " fonction ou (b) vous commencez avec un str objet et votre console de codage n'est pas de l'UTF-8.
Si comme vous le dites, vous commencez avec un objet unicode:
c'est un accident non-sens. Si vous appliquez
urllibX.unquote_YYYY()
vous obtenez un autre non-sens unicode objet (u'\xc3\xa7\xc3\xb6asd+fjkls%asd'
) qui serait la cause de vos symptômes lors de l'impression. Vous devez convertir votre original unicode objet d'un str objet immédiatement:alors vous devriez vulgaire:
De regarder les 4 premiers octets de cela, il est encodé en UTF-8. Si vous ne
print s2
il va chercher OK si votre console est en attend UTF-8, mais si elle s'attend à ISO-8859-1 (alias latin1) vous verrez votre symptomatique des ordures (le premier caractère sera-tilde). Let's park que la pensée pour un moment et de le convertir en Unicode objet:et l'inspecter pour voir ce que nous avons effectivement obtenu:
Ressemble à ce que vous avez dit que vous attendiez. Nous arrivons maintenant à la question de l'affichant sur votre console. Remarque: ne pas paniquer quand vous voyez "cp850"; je fais cela de façon portable et juste arriver à faire cela dans une Invite de Commande sous Windows.
Remarque: l'unicode objet a été explicitement codé à l'aide de sys.la sortie standard stdout.l'encodage. Heureusement que tous les caractères unicode dans les
s3
sont représentable dans ce type d'encodage (et cp1252 et latin1).En utilisant soit
unquote
ouunquote_plus
vous donnera une chaîne d'octets. Si vous voulez une chaîne Unicode, alors vous devez décoder la chaîne d'octets unicode:Par rapport à:
Noter que votre chaîne d'entrée doit être une chaîne d'octets: si vous passez unicode pour
unquote/unquote_plus
ensuite, vous aurez un peu de désordre. Si c'est le cas, alors l'encoder en premier:Essayer
urllib2
une fois de plus:'%C3%A7%C3%B6asd+fjkls%25asd' - ce n'est pas une chaîne unicode.
C'est une chaîne codée au format url. Utilisation urllib2."de() à la place.
Vous avez un double problème: votre chaîne est codé en unicode et contient un caractère urlencoded. Certains match. Vous pouvez normaliser votre chaîne ascii pour être sûr qu'il ne sera pas mal interprétée:
Vous utilisez
unquote_plus
méthode qui prendspace
en compte et la conversion de+
. Utilisez simplementunquote
méthode et vous devriez être bien.