À l'aide de python urllib.quote_plus sur des chaînes utf-8 avec " sûr " arguments
J'ai une chaîne unicode en code python:
name = u'Mayte_Martín'
Je voudrais l'utiliser avec une requête SPARQL, ce qui signifie que je doit coder la chaîne à l'aide de 'utf-8' et l'utilisation urllib.quote_plus ou des demandes.devis sur elle. Cependant, ces deux devis fonctions se comportent bizarrement comme on peut le voir lorsqu'il est utilisé avec et sans le "sécuritaire" des arguments.
from urllib import quote_plus
Sans " sûr " argument:
quote_plus(name.encode('utf-8'))
Output: 'Mayte_Mart%C3%ADn'
Avec " sûr " argument:
quote_plus(name.encode('utf-8'), safe=':/')
Output:
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-164-556248391ee1> in <module>()
----> 1 quote_plus(v, safe=':/')
/usr/lib/python2.7/urllib.pyc in quote_plus(s, safe)
1273 s = quote(s, safe + ' ')
1274 return s.replace(' ', '+')
-> 1275 return quote(s, safe)
1276
1277 def urlencode(query, doseq=0):
/usr/lib/python2.7/urllib.pyc in quote(s, safe)
1264 safe = always_safe + safe
1265 _safe_quoters[cachekey] = (quoter, safe)
-> 1266 if not s.rstrip(safe):
1267 return s
1268 return ''.join(map(quoter, s))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
Le problème semble être avec rstrip fonction. J'ai essayé de faire quelques changements et appel...
quote_plus(name.encode('utf-8'), safe=u':/'.encode('utf-8'))
Mais cela ne résout pas le problème. Quel pourrait être le problème ici?
- Je viens d'essayer votre code en python 2.7.4 & ipython 1.1.0 avec aucun problème du tout.
- Avec le 'coffre-fort' argument? J'ai python v2.7.3 et ipython v1.2.1
- Comme vous l'avez mentionné cela fonctionne pour vous, je viens de créer un autre environnement propre et il a essayé. Il fonctionne! Donc, ça doit être une ingérence de certains autres modules/activité dans mon espace de travail. Je vais essayer de comprendre ce qu'il est et de le poster ici.
- Il est perplexe. J'ai redémarré mon ipython notebook du noyau et je n'ai pas pu le reproduire maintenant.
- il y a un bug ici: bugs.python.org/issue23885 il semble python dev team ne serait pas le réparer
Vous devez vous connecter pour publier un commentaire.
Je vais répondre à ma propre question, de sorte qu'il peut aider d'autres personnes qui font face au même problème.
Ce problème particulier se pose lorsque vous effectuez l'importation suivants dans l'espace de travail courant avant l'exécution de toute autre chose.
Cela a en quelque sorte s'est avéré être incompatible avec la séquence suivante de code.
Le même code sans avoir à les importer unicode_literals fonctionne très bien.
UnicodeDecodeError
lors de la transmission des caractères non-ASCII, indépendamment de siunicode_literals
a été importé.urllib.quote_plus(u'Mayte_Martín'.encode('utf-8'), safe=':/')
donneUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
sur Python 2.7.6.Selon ce bug, voici la solution:
Vous devez
encode
à la fois argument enquote
ouquote_plus
méthode pourutf-8
urllib.unquote(encoded_name).decode('utf-8')
fonctionne sans problème pour moi (Py 2.7.9, Debian)
(Je ne connais pas la réponse, mais je ne peux pas faire de commentaires à l'égard de la réputation)