exemple de code:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Le problème: ce n'est pas lisible par l'homme. Mes utilisateurs (intelligents) veulent vérifier ou même modifier des fichiers texte avec des vidages JSON (et je préfère ne pas utiliser XML).
Existe-t-il un moyen de sérialiser des objets en chaînes JSON UTF-8 (au lieu de \uXXXX
)?
Réponses:
Utilisez le
ensure_ascii=False
commutateur àjson.dumps()
, puis encodez la valeur en UTF-8 manuellement:Si vous écrivez dans un fichier, utilisez-le
json.dump()
et laissez-le à l'objet fichier à encoder:Avertissements pour Python 2
Pour Python 2, il y a d'autres mises en garde à prendre en compte. Si vous écrivez ceci dans un fichier, vous pouvez utiliser
io.open()
au lieu deopen()
pour produire un objet fichier qui code pour vous les valeurs Unicode pendant que vous écrivez, puis utilisezjson.dump()
plutôt pour écrire dans ce fichier:Notez qu'il y a un bogue dans le
json
module où leensure_ascii=False
drapeau peut produire un mélange d' objetsunicode
etstr
. La solution de contournement pour Python 2 est alors:En Python 2, lorsque vous utilisez des chaînes d'octets (type
str
), codées en UTF-8, assurez-vous de définir également leencoding
mot - clé:la source
Pour écrire dans un fichier
Pour imprimer sur stdout
la source
codecs
bibliothèque. Merci!MISE À JOUR: C'est une mauvaise réponse, mais il est toujours utile de comprendre pourquoi elle est mauvaise. Voir les commentaires.
Et alors
unicode-escape
?la source
unicode-escape
n'est pas nécessaire: vous pouvez utiliser à lajson.dumps(d, ensure_ascii=False).encode('utf8')
place. Et il n'est pas garanti que json utilise exactement les mêmes règles que leunicode-escape
codec en Python dans tous les cas, c'est-à-dire que le résultat peut être ou ne pas être le même dans certains cas. Le downvote est pour une conversion inutile et peut-être fausse. Indépendant:print json_str
ne fonctionne que pour les locales utf8 ou siPYTHONIOENCODING
envvar spécifie utf8 ici (imprimez plutôt Unicode).json.dumps(d, ensure_ascii=False).encode('utf8')
ne fonctionne pas, du moins pour moi. Je reçois uneUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
erreur. Launicode-escape
variante fonctionne très bien cependant.La solution de contournement de Python 2 de Peters échoue sur un cas de bord:
Il se bloquait sur la partie .decode ('utf8') de la ligne 3. J'ai résolu le problème en rendant le programme beaucoup plus simple en évitant cette étape ainsi que le boîtier spécial d'ascii:
la source
unicode(data)
approche est la meilleure option plutôt que d'utiliser la gestion des exceptions. Notez que l'encoding='utf8'
argument mot - clé n'a rien à voir avec la sortie quijson.dumps()
produit; il est utilisé pour décoder l'str
entrée reçue par la fonction.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
Cela fonctionne sidumps
retourne (ascii uniquement) str ou objet unicode.str.encode('utf8')
décode implicitement en premier. Mais il en va de mêmeunicode(data)
si on lui donne unstr
objet. :-) L'utilisationio.open()
vous offre cependant plus d'options, notamment l'utilisation d'un codec qui écrit une nomenclature et vous suivez les données JSON avec autre chose..encode('utf8')
variante basée sur fonctionne à la fois sur Python 2 et 3 (le même code). Il n'y en a pasunicode
sur Python 3. Sans rapport: les fichiers json ne doivent pas utiliser la nomenclature (bien qu'un analyseur json confirmant puisse ignorer la nomenclature, voir errate 3983 ).encoding='utf8'
àjson.dumps
résoudre le problème. PS J'ai un texte cyrillique à viderDepuis Python 3.7, le code suivant fonctionne correctement:
Production:
la source
Ce qui suit est ma compréhension de la lecture de var var réponse ci-dessus et google.
la source
Voici ma solution en utilisant json.dump ():
où SYSTEM_ENCODING est défini sur:
la source
Utilisez des codecs si possible,
la source
Merci pour la réponse originale ici. Avec python 3, la ligne de code suivante:
c'était OK. Pensez à ne pas écrire trop de texte dans le code si ce n'est pas impératif.
Cela pourrait être suffisant pour la console python. Cependant, pour satisfaire un serveur, vous devrez peut-être définir les paramètres régionaux comme expliqué ici (si c'est sur apache2) http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
installez essentiellement he_IL ou toute langue locale sur ubuntu, vérifiez qu'il n'est pas installé
installez-le où XX est votre langue
Par exemple:
ajoutez le texte suivant à / etc / apache2 / envvrs
Avec un peu de chance, vous n'obtiendrez pas d'erreurs python sur apache comme:
Toujours dans apache, essayez de faire utf l'encodage par défaut comme expliqué ici:
Comment changer l'encodage par défaut en UTF-8 pour Apache?
Faites-le tôt car les erreurs Apache peuvent être difficiles à déboguer et vous pouvez penser à tort que cela provient de Python, ce qui n'est peut-être pas le cas dans cette situation.
la source
Si vous chargez une chaîne JSON à partir d'un fichier et de son contenu, des textes arabes. Ensuite, cela fonctionnera.
Supposons un fichier comme: arabic.json
Obtenez le contenu arabe du fichier arabic.json
Pour utiliser les données JSON dans le modèle Django, procédez comme suit:
la source
fh.close()
fh
n'est pas défini.f.close()
utiliser unicode-escape pour résoudre le problème
Explique
ressource d'origine: https://blog.csdn.net/chuatony/article/details/72628868
la source
L'utilisation de Ensure_ascii = False dans json.dumps est la bonne direction pour résoudre ce problème, comme l'a souligné Martijn. Cependant, cela peut soulever une exception:
Vous avez besoin de paramètres supplémentaires dans site.py ou sitecustomize.py pour définir votre sys.getdefaultencoding () correctement. site.py est sous lib / python2.7 / et sitecustomize.py est sous lib / python2.7 / site-packages.
Si vous souhaitez utiliser site.py, sous def setencoding (): remplacez le premier if 0: par if 1: afin que python utilise les paramètres régionaux de votre système d'exploitation.
Si vous préférez utiliser sitecustomize.py, qui peut ne pas exister si vous ne l'avez pas créé. mettez simplement ces lignes:
Ensuite, vous pouvez faire une sortie json chinoise au format utf-8, telle que:
Vous obtiendrez une chaîne encodée en utf-8, plutôt que \ u une chaîne json échappée.
Pour vérifier votre encodage par défaut:
Vous devriez obtenir "utf-8" ou "UTF-8" pour vérifier vos paramètres site.py ou sitecustomize.py.
Veuillez noter que vous ne pouvez pas faire sys.setdefaultencoding ("utf-8") sur la console python interactive.
la source
json
« sensure_ascii=False
. Fournissez un exemple de code complet minimal si vous pensez le contraire.