type - ¿Cómo se puede unir una cadena unicode urlencoded en python?
u00f3 unicode python (4)
Tengo una cadena Unicode como "Tanım" que está codificada como "Tan% u0131m" de alguna manera. ¿Cómo puedo convertir esta cadena codificada a unicode original? Aparentemente, urllib.unquote no es compatible con Unicode.
% uXXXX es un esquema de codificación no estándar que ha sido rechazado por el w3c, a pesar de que una implementación continúa viva en JavaScript.
La técnica más común parece ser que UTF-8 codifica la cadena y luego% escapa de los bytes resultantes usando% XX. Este esquema es compatible con urllib.unquote:
>>> urllib2.unquote("%0a")
''/n''
Desafortunadamente, si realmente necesitas soportar% uXXXX, probablemente tendrás que hacer rodar tu propio decodificador. De lo contrario, es mucho más preferible que simplemente UTF-8 codifique su Unicode y luego% escape los bytes resultantes.
Un ejemplo más completo:
>>> u"Tanım"
u''Tan/u0131m''
>>> url = urllib.quote(u"Tanım".encode(''utf8''))
>>> urllib.unquote(url).decode(''utf8'')
u''Tan/u0131m''
Esto lo hará si es absolutamente necesario tener esto (realmente estoy de acuerdo con los gritos de "no estándar"):
from urllib import unquote
def unquote_u(source):
result = unquote(source)
if ''%u'' in result:
result = result.replace(''%u'',''//u'').decode(''unicode_escape'')
return result
print unquote_u(''Tan%u0131m'')
> Tanım
hay un error en la versión anterior donde a veces se asusta cuando hay caracteres codificados en ascii y codificados en unicode en la cadena. Creo que es específicamente cuando hay caracteres del rango superior 128 como ''/ xab'' además de unicode.
p.ej. "% 5B% AB% u03E1% BB% 5D" causa este error.
Descubrí que si acaba de hacer los Unicode primero, el problema desapareció:
def unquote_u(source):
result = source
if ''%u'' in result:
result = result.replace(''%u'',''//u'').decode(''unicode_escape'')
result = unquote(result)
return result
def unquote(text):
def unicode_unquoter(match):
return unichr(int(match.group(1),16))
return re.sub(r''%u([0-9a-fA-F]{4})'',unicode_unquoter,text)