/ / Conversion de caractères Unicode à partir de JSON retourné en python - python, windows, json, cmd, musicbrainz

Conversion de caractères Unicode à partir de JSON retourné en python - python, windows, json, cmd, musicbrainz

J'essaie de renvoyer JSON du service APIde musicbrainz, les données retournées pour certaines chansons ont des caractères Unicode que j'ai du mal à les convertir en symboles réguliers, etc. Veuillez me faire savoir ce que je dois faire ici.

JSON:

{
"status": "ok",
"results": [{
"recordings": [{
"duration": 402,
"tracks": [{
"duration": 402,
"position": 6,
"medium": {
"release": {
"id": "dde6ecee-8e9b-4b46-8c28-0f8d659f83ac",
"title": "Tecno Fes, Volume 2"
},
"position": 1,
"track_count": 11
},
"artists": [{
"id": "57c1e5ea-e08f-413a-bcb1-f4e4b675bead",
"name": "Gigi Du2019Agostino"
}],
"title": "You Spin Me Round"
}],
"id": "2e0a7bce-9e44-4a63-a789-e8c4d2a12af9"
}, ....

Code échoué (exemple):

string = "u0420u043eu0441u0441u0438u044f"
print string.encode("utf-8")

J'utilise ceci sur une machine Windows 7 et j'ai python 2.7 et j'exécute ce code sur un terminal de ligne de commande .. J'ai la sortie que j'obtiens ci-dessous:

C:Python27>python junk.py Gigi DGÇÖAgostino Gigi D?Agostino Gigi Du2019Agostino

Je m'attends à ce que la sortie soit Gigi D" Agostino

Réponses:

0 pour la réponse № 1

Vous utilisez le cmd sous Windows? Dans ce cas, il pourrait être un peu difficile de faire fonctionner Unicode pour qu'il s'affiche correctement. Vous voudrez peut-être penser à utiliser un autre "terminal" pour tester vos scripts. MSYS fournit un joli terminal / shell et IDLE est inclus dans la distribution Windows Python et possède un shell Python (clic droit, ouvert dans IDLE, F5).

Si vous voulez vraiment le faire fonctionner dans le cmd:

Vous devez définir Lucida Console comme police dans cmd. Ensuite:

> chcp
Active code page: 850
> chcp 65001

Ensuite, vous devriez avoir une sortie unicode dans le cmd. Votre «page de codes active» peut être différente. Notez que quelque part, car vous voudrez peut-être le modifier par la suite:

> chcp 850

Sinon, vous rencontrerez d'autres problèmes (démarrage .bat fichiers ne fonctionne pas). (Voir également encodage de fichiers batch)

Dans votre script, vous avez également besoin de ceci:

import codecs

def cp65001(name):
"""This might be buggy, but better than just a LookupError
"""
if name.lower() == "cp65001":
return codecs.lookup("utf-8")

codecs.register(cp65001)

Sinon, python va planter. (voir windows-cmd-encoding-change-causes-python-crash)

J'ai eu un semblable rapport d'erreur pour mon script.


Vous pouvez également envisager d'utiliser une bibliothèque pour accéder au service Web MusicBrainz. Python-musicbrainzngs fonctionne avec le ws / 2 actuel.


1 pour la réponse № 2

L'évasion Unicode ne fonctionne qu'avec des chaînes Unicode, pour convertir votre chaîne régulière en utilisation Unicode str.decode("unicode-escape"):

In [1]: s="u0420u043eu0441u0441u0438u044f"

In [2]: s
Out[2]: "\u0420\u043e\u0441\u0441\u0438\u044f"

In [3]: s.decode("unicode-escape")
Out[3]: u"u0420u043eu0441u0441u0438u044f"

In [4]: print s.decode("unicode-escape")
Россия

In [5]: s2="Gigi Du2019Agostino"

In [6]: s2
Out[6]: "Gigi D\u2019Agostino"

In [7]: print s2.decode("unicode-escape")
Gigi D’Agostino

0 pour la réponse № 3

Vous devez utiliser l'analyseur json qui renvoie une chaîne Unicode comme tout analyseur json valide. Votre exemple d'échec montre un bytestring, c'est-à-dire que vous n'avez pas utilisé un analyseur json.

Par exemple, pour analyser des données json:

obj = json.load(urllib2.urlopen(request))

Pour une jolie impression obj sans utiliser les échappements Unicode:

print json.dumps(obj, indent=4, ensure_ascii=False)

Il est également utile de comprendre la différence entre:

print unicode_string

Et:

print repr(unicode_string)