Beispielcode:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Das Problem: Es ist nicht für Menschen lesbar. Meine (intelligenten) Benutzer möchten Textdateien mit JSON-Dumps überprüfen oder sogar bearbeiten (und ich möchte lieber kein XML verwenden).
Gibt es eine Möglichkeit, Objekte in UTF-8-JSON-Zeichenfolgen (anstelle von \uXXXX
) zu serialisieren ?
Antworten:
Verwenden Sie den
ensure_ascii=False
Schalterjson.dumps()
, um den Wert manuell in UTF-8 zu codieren:Wenn Sie in eine Datei schreiben, verwenden Sie sie einfach
json.dump()
und überlassen Sie sie dem zu codierenden Dateiobjekt:Vorsichtsmaßnahmen für Python 2
Bei Python 2 sind einige weitere Einschränkungen zu beachten. Wenn Sie dies in eine Datei schreiben, können Sie
io.open()
stattdessenopen()
ein Dateiobjekt erstellen, das beim Schreiben Unicode-Werte für Sie codiert, undjson.dump()
stattdessen in diese Datei schreiben:Beachten Sie, dass das
json
Modul einen Fehler enthält, durch den dasensure_ascii=False
Flag eine Mischung ausunicode
undstr
Objekten erzeugen kann . Die Problemumgehung für Python 2 lautet dann:Stellen Sie in Python 2 bei Verwendung von Byte-Strings (Typ
str
), die in UTF-8 codiert sind, sicher, dass Sie auch dasencoding
Schlüsselwort festlegen :quelle
In eine Datei schreiben
Auf Standard drucken
quelle
codecs
Bibliothek. Vielen Dank!UPDATE: Dies ist eine falsche Antwort, aber es ist immer noch nützlich zu verstehen, warum es falsch ist. Zeige Kommentare.
Wie wäre es
unicode-escape
?quelle
unicode-escape
ist nicht notwendig: Sie könntenjson.dumps(d, ensure_ascii=False).encode('utf8')
stattdessen verwenden. Und es kann nicht garantiert werden, dass json in allen Fällen genau die gleichen Regeln wie derunicode-escape
Codec in Python verwendet, dh das Ergebnis kann in einigen Eckfällen das gleiche sein oder auch nicht. Die Ablehnung ist für eine unnötige und möglicherweise falsche Konvertierung. Nicht verwandt: Funktioniert nur für utf8-Gebietsschemas oder wenn envvar hier utf8 angibt (stattdessen Unicode drucken).print json_str
PYTHONIOENCODING
json.dumps(d, ensure_ascii=False).encode('utf8')
funktioniert zumindest für mich nicht. Ich bekommeUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
Fehler. Dieunicode-escape
Variante funktioniert jedoch einwandfrei.Peters 'Python 2-Problemumgehung schlägt in einem Randfall fehl:
Es stürzte im .decode ('utf8') Teil von Zeile 3 ab. Ich habe das Problem behoben, indem ich das Programm viel einfacher gemacht habe, indem ich diesen Schritt sowie das spezielle Gehäuse von ASCII vermieden habe:
quelle
unicode(data)
Ansatz ist die bessere Option als die Ausnahmebehandlung. Beachten Sie, dass dasencoding='utf8'
Schlüsselwortargument nichts mit der Ausgabe zu tun hat, diejson.dumps()
erzeugt wird. Es wird zum Decodieren vonstr
Eingaben verwendet, die die Funktion empfängt.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
Es funktioniert, obdumps
(nur ASCII ) str oder Unicode-Objekt zurückgegeben wird.str.encode('utf8')
dekodiert wird . Aber auchunicode(data)
, wenn einstr
Objekt gegeben ist. :-) Mit Using habenio.open()
Sie jedoch mehr Optionen, einschließlich der Verwendung eines Codecs, der eine Stückliste schreibt, und Sie folgen den JSON-Daten mit etwas anderem..encode('utf8')
-basierte Variante funktioniert sowohl mit Python 2 als auch mit Python 3 (der gleiche Code). Inunicode
Python 3 gibt es keine. Keine Beziehung: JSON-Dateien sollten keine Stückliste verwenden (obwohl ein bestätigender JSON-Parser möglicherweise die Stückliste ignoriert, siehe Fehler 3983 ).encoding='utf8'
umjson.dumps
das Problem zu lösen. PS Ich habe einen kyrillischen Text zu entleerenAb Python 3.7 funktioniert der folgende Code einwandfrei:
Ausgabe:
quelle
Das Folgende ist mein Verständnis var Leseantwort oben und Google.
quelle
Hier ist meine Lösung mit json.dump ():
Dabei ist SYSTEM_ENCODING auf Folgendes festgelegt:
quelle
Verwenden Sie nach Möglichkeit Codecs.
quelle
Danke für die ursprüngliche Antwort hier. Mit Python 3 die folgende Codezeile:
war in Ordnung. Versuchen Sie, nicht zu viel Text in den Code zu schreiben, wenn dies nicht unbedingt erforderlich ist.
Dies ist möglicherweise gut genug für die Python-Konsole. Um einen Server zufrieden zu stellen, müssen Sie möglicherweise das Gebietsschema wie hier beschrieben festlegen (wenn es sich um Apache2 handelt). Http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
Installieren Sie im Grunde he_IL oder ein anderes Sprachgebietsschema auf Ubuntu und überprüfen Sie, ob es nicht installiert ist
Installieren Sie es dort, wo XX Ihre Sprache ist
Zum Beispiel:
Fügen Sie den folgenden Text zu / etc / apache2 / envvrs hinzu
Dann würden Sie hoffentlich keine Python-Fehler von Apache bekommen wie:
Versuchen Sie auch in Apache, utf als Standardcodierung festzulegen, wie hier erläutert: Wie ändere ich die Standardcodierung
für Apache in UTF-8?
Tun Sie es frühzeitig, da das Debuggen von Apache-Fehlern schmerzhaft sein kann und Sie fälschlicherweise glauben können, dass es sich um Python handelt, was in dieser Situation möglicherweise nicht der Fall ist
quelle
Wenn Sie eine JSON-Zeichenfolge aus einer Datei und einem Dateiinhalt mit arabischen Texten laden. Dann wird das funktionieren.
Angenommen, Datei wie: arabic.json
Rufen Sie den arabischen Inhalt aus der Datei arabic.json ab
Führen Sie die folgenden Schritte aus, um JSON-Daten in der Django-Vorlage zu verwenden:
quelle
fh.close()
fh
ist nicht definiert.f.close()
Verwenden Sie Unicode-Escape, um das Problem zu lösen
erklären
ursprüngliche Ressource: https://blog.csdn.net/chuatony/article/details/72628868
quelle
Die Verwendung von sure_ascii = False in json.dumps ist die richtige Richtung, um dieses Problem zu lösen, wie Martijn hervorhob. Dies kann jedoch eine Ausnahme auslösen:
Sie benötigen zusätzliche Einstellungen in site.py oder sitecustomize.py, um sys.getdefaultencoding () korrekt einzustellen. site.py befindet sich unter lib / python2.7 / und sitecustomize.py befindet sich unter lib / python2.7 / site-packages.
Wenn Sie site.py verwenden möchten, ändern Sie unter def setencoding (): das erste if 0: in if 1:, damit Python das Gebietsschema Ihres Betriebssystems verwendet.
Wenn Sie sitecustomize.py bevorzugen, die möglicherweise nicht vorhanden ist, wenn Sie sie nicht erstellt haben. Setzen Sie einfach diese Zeilen:
Dann können Sie eine chinesische json-Ausgabe im utf-8-Format ausführen, z.
Sie erhalten eine utf-8-codierte Zeichenfolge anstelle einer maskierten JSON-Zeichenfolge.
So überprüfen Sie Ihre Standardcodierung:
Sie sollten "utf-8" oder "UTF-8" erhalten, um Ihre Einstellungen für site.py oder sitecustomize.py zu überprüfen.
Bitte beachten Sie, dass Sie sys.setdefaultencoding ("utf-8") in der interaktiven Python-Konsole nicht ausführen konnten.
quelle
json
's zu tunensure_ascii=False
. Geben Sie ein minimales vollständiges Codebeispiel an, wenn Sie anders denken.