Mit python ist das urllib.quote_plus auf utf-8-strings mit 'sicher' Argumente
Ich habe ein unicode-string im python-code:
name = u'Mayte_Martín'
Ich würde gerne verwenden Sie es mit einer SPARQL-Abfrage, was bedeutete, dass ich encode die Zeichenkette mit 'utf-8', und verwenden Sie das urllib.quote_plus oder Anfragen.Zitat auf. Jedoch, diese beiden Zitat-Funktionen Verhalten sich seltsam, wie gesehen werden kann, wenn verwendet, mit und ohne die 'safe' - Argumente.
from urllib import quote_plus
Ohne 'safe' - argument:
quote_plus(name.encode('utf-8'))
Output: 'Mayte_Mart%C3%ADn'
Mit 'safe' - 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)
Scheint das problem zu sein, mit rstrip-Funktion. Ich habe versucht, einige änderungen vorzunehmen und nennen als...
quote_plus(name.encode('utf-8'), safe=u':/'.encode('utf-8'))
Aber nicht, das Problem zu lösen. Was könnte hier das Problem?
Ich versuche nur den code mit python 2.7.4 & ipython 1.1.0 mit überhaupt keine Probleme.
Mit der 'sicheren' argument? Ich habe python v2.7.3 und ipython v1.2.1
Wie Sie bereits erwähnt, es funktioniert für Sie, ich gerade erstellt ein weiteres Umwelt sauber und versuchte es. Es funktioniert! Es muss also eine Interferenz von einigen anderen Modul/Tätigkeit in meinem Arbeitsbereich. Ich werde versuchen, herauszufinden, was es ist und poste es hier.
Es ist verwirrend. Ich neugestartet mein ipython notebook kernel und ich war nicht in der Lage, es jetzt zu reproduzieren.
es ist ein bug hier: bugs.python.org/issue23885 es scheint python-dev-team wäre nicht zu beheben
Mit der 'sicheren' argument? Ich habe python v2.7.3 und ipython v1.2.1
Wie Sie bereits erwähnt, es funktioniert für Sie, ich gerade erstellt ein weiteres Umwelt sauber und versuchte es. Es funktioniert! Es muss also eine Interferenz von einigen anderen Modul/Tätigkeit in meinem Arbeitsbereich. Ich werde versuchen, herauszufinden, was es ist und poste es hier.
Es ist verwirrend. Ich neugestartet mein ipython notebook kernel und ich war nicht in der Lage, es jetzt zu reproduzieren.
es ist ein bug hier: bugs.python.org/issue23885 es scheint python-dev-team wäre nicht zu beheben
InformationsquelleAutor gopalkoduri | 2014-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bin ich die Beantwortung meiner eigenen Frage, so dass es anderen helfen kann, die vor dem gleichen Problem.
Diesem speziellen Problem entsteht, wenn Sie die folgenden import in den aktuellen Arbeitsbereich vor der Ausführung alles andere.
Dieser hat irgendwie stellte sich heraus unvereinbar mit der folgenden Sequenz von code.
Den gleichen code, ohne Sie zu importieren unicode_literals funktioniert einwandfrei.
UnicodeDecodeError
bei der übergabe alle nicht-ASCII-Zeichen, unabhängig davon, obunicode_literals
importiert wurde.Interessant. Können Sie zitieren den genauen code, den Sie verwenden, um es zu tun?
urllib.quote_plus(u'Mayte_Martín'.encode('utf-8'), safe=':/')
gibtUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
auf Python 2.7.6.Kodieren beide argument funktionieren würde. siehe meine Antwort zum Beispiel
InformationsquelleAutor gopalkoduri
Laut dieser Fehler, hier die Lösung:
Müssen Sie
encode
beide argument inquote
oderquote_plus
Methodeutf-8
urllib.unquote(encoded_name).decode('utf-8')
InformationsquelleAutor Xiao
funktioniert ohne problem für mich (Py 2.7.9, Debian)
(Ich kenne die Antwort nicht, aber ich kann nicht auf Kommentare mit Bezug auf den Ruf)
InformationsquelleAutor mirek