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.¿Cómo se puede unir una cadena unicode urlencoded en python?
Respuesta
% 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'
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)
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
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. –
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. –
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
\ 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
- 1. Python: Crear una cadena Unicode
- 2. Cómo puedo unir caracteres Unicode en Java
- 3. Transformar cadena unicode en python
- 4. cadena de Python a Unicode
- 5. Python: Sanitize una cadena para Unicode?
- 6. LINQ, no se puede unir a la cadena
- 7. Python: ¿Cómo hacer que StringIO.writelines acepte una cadena unicode?
- 8. conseguir bytes de cadena Unicode en Python
- 9. Cómo convertir una cadena x-www-form-urlencoded a JSON?
- 10. Cómo implementar la coincidencia de cadena Unicode plegando en python
- 11. ¿Cómo puedo verificar una cadena Unicode de Python para ver que * en realidad * es Unicode correcto?
- 12. Cómo convertir secuencias de escape unicode a caracteres Unicode en una cadena de python
- 13. Reemplazar caracteres no ASCII de una cadena Unicode en Python
- 14. Python: Usando .format() en una cadena escapada en Unicode
- 15. hash de cadena Unicode en Python
- 16. Cadena en python con mi Unicode?
- 17. ¿Cómo puedo unir los caracteres unicode en antlr
- 18. cadena Unicode en XML
- 19. python obtener tamaño de cadena Unicode
- 20. ¿Cómo convierto un Unicode en una cadena en el nivel de Python?
- 21. cómo extraer una cadena Unicode con Boost.Python
- 22. PHP construir una cadena Unicode?
- 23. Convertir una cadena Unicode en una cadena ASCII de escape
- 24. Linux/Python: codificación de una cadena Unicode para imprimir
- 25. Cómo trabajar con Unicode en Python
- 26. ¿Por qué declarar unicode por cadena en python?
- 27. Cómo deshacer la cadena Unicode en C#
- 28. Cómo unir una matriz asociativa a una cadena
- 29. Python y Unicode: ¿Cómo debería ser todo lo Unicode
- 30. Python Unicode Encoding
'urllib2.unquote' debería ser 'urllib.unquote' – jamtoday
interesante que un URI es una de bytes codificados por ciento cadena, en lugar de una cadena de caracteres. – wberry
@jamtoday no necesariamente, en Python 2.7.5+ puede usar 'urllib2.unquote' simplemente intente' print (dir (urllib2)) ' –