J'ai une chaîne unicode comme "Tanım" qui est codée comme "Tan% u0131m" en quelque sorte. Comment puis-je convertir cette chaîne codée en unicode d'origine. Apparemment, urllib.unquote ne prend pas en charge unicode.Comment unquote une chaîne unicode urlencoded en python?
Répondre
% uXXXX est un non-standard encoding scheme qui a été rejetée par le w3c, en dépit du fait qu'une mise en œuvre continue de vivre dans la terre JavaScript.
La technique la plus courante semble être de coder la chaîne UTF-8, puis% d'échapper les octets résultants en utilisant% XX. Ce programme est soutenu par urllib.unquote:
>>> urllib2.unquote("%0a")
'\n'
Malheureusement, si vous avez vraiment besoin pour soutenir% uXXXX, vous aurez probablement rouler votre propre décodeur. Sinon, il est probablement préférable de simplement encoder votre Unicode UTF-8, puis% d'échapper les octets qui en résultent.
Un exemple plus complet:
>>> 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)
Cela fera si vous devez absolument avoir ce (je ne vraiment d'accord avec les cris de « non standard »):
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 cas légèrement pathologique, mais: unquote_u ('Tan% 25u0131m') -> u'Tan \ u0131m 'plutôt que' Tan% u0131 'comme il se doit. Juste un rappel de pourquoi vous ne voulez probablement pas écrire un décodeur, sauf si vous en avez vraiment besoin. –
Je suis totalement d'accord. C'est pourquoi je n'étais vraiment pas désireux d'offrir une solution réelle. Ces choses ne sont jamais si simples. L'O.P. aurait pu être désespérée cependant, et je pense que cela complète votre excellente réponse. –
Il y a un bogue dans la version ci-dessus où il flippe parfois quand il y a des caractères codés en ASCII et unicode dans la chaîne. Je pense que c'est spécifiquement quand il y a des caractères de la gamme supérieure 128 comme '\ xab' en plus de l'Unicode.
par ex. "% 5B% AB% u03E1% BB% 5D" provoque cette erreur.
J'ai trouvé si vous venez de faire les unicode d'abord, le problème a disparu:
def unquote_u(source):
result = source
if '%u' in result:
result = result.replace('%u','\\u').decode('unicode_escape')
result = unquote(result)
return result
\ xab n'est pas un caractère mais un octet. En effet votre exemple "chaîne" contient à la fois des octets et des caractères, ce qui n'est pas valable comme une seule chaîne dans n'importe quelle langue que je connaisse. – wberry
- 1. WCF Unicode UrlEncoded Ne pas arriver gentiment
- 2. Conversion d'entités XML/HTML en chaîne Unicode en Python
- 3. Chaîne AS3 util pour convertir en x-www-form-urlencoded?
- 4. Comment traiter une chaîne ASCII comme unicode et annuler l'échappement des caractères d'échappement en python?
- 5. Ruby: Comment casser une chaîne potentiellement unicode en octets
- 6. Python Unicode UnicodeEncodeError
- 7. Comment convertir des séquences d'échappement Unicode en caractères Unicode dans une chaîne .NET?
- 8. Latin-1 et l'usine unicode en Python
- 9. Conversion d'une chaîne hexadécimale en unicode
- 10. URL: Binaire Blob, Unicode ou Encodé Chaîne Unicode?
- 11. chaîne automatique Unicode formatage en Java
- 12. Lire des chaînes Unicode "crues" en Python
- 13. Recherche d'un fichier Unicode en utilisant Python
- 14. recherche chaîne unicode
- 15. Unicode utf-8/UTF-16 en Python
- 16. En Python, comment transformer une chaîne en un fichier?
- 17. Convertir un codepoint unicode en hexadécimal UTF8 en python
- 18. Bloc Unicode d'un caractère en python
- 19. Python Unicode et Mimee
- 20. Comment inverser la décomposition Unicode en utilisant Python?
- 21. Comment analyser une chaîne de date HTTP en Python?
- 22. Comment insérer une chaîne dans un fichier en Python?
- 23. Un moyen efficace d'ajouter itérativement à une chaîne en Python?
- 24. Chaînes python c-api et unicode
- 25. python - problèmes avec l'expression régulière et unicode
- 26. Python et expression régulière avec Unicode
- 27. Exécuter une chaîne en tant que commande en python
- 28. Comment diviser une chaîne en une liste?
- 29. Inversion de chaîne en Python
- 30. Python: test pour unicode, et conversion en temps()
« urllib2.unquote » devrait être « urllib.unquote » – jamtoday
Intéressant qu'un URI est un pour cent de byte codé chaîne, plutôt qu'une chaîne de caractères. – wberry
@jamtoday pas nécessairement, en Python 2.7.5+ vous pouvez utiliser 'urllib2.unquote' juste essayer' imprimer (dir (urllib2)) ' –