Kode sampel:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Masalahnya: itu tidak dapat dibaca manusia. Pengguna (cerdas) saya ingin memverifikasi atau bahkan mengedit file teks dengan dump JSON (dan saya lebih suka tidak menggunakan XML).
Apakah ada cara untuk membuat objek bersambung menjadi string UTF-8 JSON (bukan \uXXXX
)?
Jawaban:
Gunakan
ensure_ascii=False
sakelar kejson.dumps()
, lalu enkode nilai ke UTF-8 secara manual:Jika Anda menulis ke file, cukup gunakan
json.dump()
dan serahkan ke objek file untuk menyandikan:Peringatan untuk Python 2
Untuk Python 2, ada beberapa peringatan yang perlu dipertimbangkan. Jika Anda menulis ini ke file, Anda bisa menggunakan
io.open()
alih-alihopen()
menghasilkan objek file yang mengkodekan nilai Unicode untuk Anda saat Anda menulis, kemudian gunakanjson.dump()
untuk menulis ke file itu:Apakah dicatat bahwa ada bug di
json
modul manaensure_ascii=False
bendera dapat menghasilkan campuran dariunicode
danstr
benda-benda. Solusinya untuk Python 2 adalah:Dalam Python 2, saat menggunakan string byte (tipe
str
), disandikan ke UTF-8, pastikan juga mengaturencoding
kata kunci:sumber
Untuk menulis ke file
Untuk mencetak ke stdout
sumber
codecs
perpustakaan. Terima kasih!UPDATE: Ini adalah jawaban yang salah, tetapi masih berguna untuk memahami mengapa itu salah. Lihat komentar.
Bagaimana dengan
unicode-escape
?sumber
unicode-escape
tidak perlu: Anda bisa menggunakannyajson.dumps(d, ensure_ascii=False).encode('utf8')
. Dan tidak dijamin bahwa json menggunakan aturan yang sama persis sepertiunicode-escape
codec dalam Python dalam semua kasus yaitu, hasilnya mungkin atau mungkin tidak sama dalam beberapa kasus sudut. Downvote adalah untuk konversi yang tidak perlu dan mungkin salah. Tidak terkait:print json_str
hanya berfungsi untuk lokal utf8 atau jikaPYTHONIOENCODING
envvar menentukan utf8 di sini (cetak Unicode sebagai gantinya).json.dumps(d, ensure_ascii=False).encode('utf8')
tidak berfungsi, setidaknya untuk saya. Saya mendapatkan -UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
teror. Theunicode-escape
varian bekerja dengan baik namun.Pemecahan masalah python 2 Peters gagal pada kasus tepi:
Itu menabrak bagian .decode ('utf8') dari baris 3. Saya memperbaiki masalah dengan membuat program lebih sederhana dengan menghindari langkah itu serta casing khusus ascii:
sumber
unicode(data)
Pendekatan Anda adalah opsi yang lebih baik daripada menggunakan penanganan pengecualian. Perhatikan bahwaencoding='utf8'
argumen kata kunci tidak ada hubungannya dengan output yangjson.dumps()
menghasilkan; digunakan untuk mendekodestr
input yang diterima fungsi.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
Ini berfungsi baikdumps
mengembalikan (ascii-only) str atau objek unicode.str.encode('utf8')
menerjemahkan pertama kali secara implisit. Tapi begitu jugaunicode(data)
, jika diberistr
objek. :-) Menggunakanio.open()
memberi Anda lebih banyak opsi, termasuk menggunakan codec yang menulis BOM dan Anda mengikuti data JSON dengan sesuatu yang lain..encode('utf8')
varian berbasis-bekerja pada kedua Python 2 dan 3 (kode yang sama). Tidak adaunicode
pada Python 3. Tidak terkait: file json tidak boleh menggunakan BOM (meskipun parser json yang mengonfirmasi dapat mengabaikan BOM, lihat errate 3983 ).encoding='utf8'
untukjson.dumps
memecahkan masalah. PS Saya punya teks cyrillic untuk dibuangPada Python 3.7 kode berikut berfungsi dengan baik:
Keluaran:
sumber
Berikut ini adalah pemahaman saya atas jawaban bacaan di atas dan google.
sumber
Inilah solusi saya menggunakan json.dump ():
tempat SYSTEM_ENCODING diatur ke:
sumber
Gunakan codec jika memungkinkan,
sumber
Terima kasih atas jawaban aslinya di sini. Dengan python 3 baris kode berikut:
ok Pertimbangkan untuk mencoba tidak menulis terlalu banyak teks dalam kode jika itu tidak penting.
Ini mungkin cukup baik untuk konsol python. Namun, untuk memenuhi server Anda mungkin perlu mengatur lokal seperti yang dijelaskan di sini (jika ada di apache2) http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
pada dasarnya instal he_IL atau bahasa lokal apa pun di ubuntu periksa itu tidak diinstal
instal di mana XX adalah bahasa Anda
Sebagai contoh:
tambahkan teks berikut ke / etc / apache2 / envvrs
Daripada semoga Anda tidak mendapatkan kesalahan python dari apache seperti:
Juga di apache coba utf melakukan pengkodean default seperti yang dijelaskan di sini:
Bagaimana cara mengubah pengkodean default ke UTF-8 untuk Apache?
Lakukan lebih awal karena kesalahan apache dapat menyulitkan untuk debug dan Anda dapat secara keliru menganggapnya dari python yang mungkin tidak terjadi dalam situasi itu
sumber
Jika Anda memuat string JSON dari file & isi file teks arab. Maka ini akan berhasil.
Asumsikan File seperti: arabic.json
Dapatkan konten arab dari file arabic.json
Untuk menggunakan Data JSON di Template Django ikuti langkah-langkah berikut:
sumber
fh.close()
fh
tidak terdefinisi.f.close()
gunakan unicode-escape untuk menyelesaikan masalah
menjelaskan
sumber asli :https://blog.csdn.net/chuatony/article/details/72628868
sumber
Menggunakan sure_ascii = Salah di json.dumps adalah arah yang benar untuk menyelesaikan masalah ini, seperti yang ditunjukkan oleh Martijn. Namun, ini dapat menimbulkan pengecualian:
Anda memerlukan pengaturan tambahan di salah satu site.py atau sitecustomize.py untuk mengatur sys.getdefaultencoding () Anda benar. site.py berada di bawah lib / python2.7 / dan sitecustomize.py berada di bawah lib / python2.7 / paket-situs.
Jika Anda ingin menggunakan site.py, di bawah def setencoding (): ubah yang pertama jika 0: menjadi jika 1: sehingga python akan menggunakan lokal sistem operasi Anda.
Jika Anda lebih suka menggunakan sitecustomize.py, yang mungkin tidak ada jika Anda belum membuatnya. cukup cantumkan baris berikut:
Kemudian Anda dapat melakukan beberapa output json Cina dalam format utf-8, seperti:
Anda akan mendapatkan string yang dikodekan utf-8, dan bukannya Anda melepaskan string json.
Untuk memverifikasi penyandian default Anda:
Anda harus mendapatkan "utf-8" atau "UTF-8" untuk memverifikasi pengaturan site.py atau sitecustomize.py Anda.
Harap dicatat bahwa Anda tidak dapat melakukan sys.setdefaultencoding ("utf-8") di konsol python interaktif.
sumber
json
'sensure_ascii=False
. Berikan contoh kode lengkap minimal jika Anda berpikir sebaliknya.