u00f3 type caracteres python unicode character-encoding urllib w3c

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)