2008-11-18 13 views

Respuesta

63

% uXXXX es un non-standard encoding scheme que ha sido rechazada por el W3C, a pesar del hecho de que una implementación sigue viviendo en la tierra 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 está apoyado por urllib.unquote:

>>> urllib2.unquote("%0a") 
'\n' 

Por desgracia, si realmente necesita para apoyar% uXXXX, es probable que tenga a rodar su 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' 
+3

'urllib2.unquote' debería ser 'urllib.unquote' – jamtoday

+0

interesante que un URI es una de bytes codificados por ciento cadena, en lugar de una cadena de caracteres. – wberry

+0

@jamtoday no necesariamente, en Python 2.7.5+ puede usar 'urllib2.unquote' simplemente intente' print (dir (urllib2)) ' –

9
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) 
6

Esto lo hará si usted absolutamente tiene que tener esto (la verdad es que 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 
+1

Un caso ligeramente patológico, pero: unquote_u ('Tan% 25u0131m') -> u'Tan \ u0131m en lugar de 'Tan% u0131' como debería. Solo un recordatorio de por qué es probable que no quieras escribir un decodificador a menos que realmente lo necesites. –

+0

Estoy totalmente de acuerdo. Es por eso que realmente no estaba dispuesto a ofrecer una solución real. Estas cosas nunca son tan sencillas. El O.P. podría haber sido desesperado, y creo que esto complementa su excelente respuesta. –

4

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.

por ejemplo. "% 5B% AB% u03E1% BB% 5D" causa este error.

he encontrado si usted acaba de hacer los Unicode en primer lugar, el problema se fue:

def unquote_u(source): 
    result = source 
    if '%u' in result: 
    result = result.replace('%u','\\u').decode('unicode_escape') 
    result = unquote(result) 
    return result 
+0

\ xab no es un personaje sino un byte. En efecto, su ejemplo "cadena" contiene tanto bytes como caracteres, lo cual no es válido como una sola cadena en ningún idioma que conozca. – wberry

Cuestiones relacionadas