SORU
20 AĞUSTOS 2013, Salı


Tasarruf utf-8 json metinler.\u olarak UTF8 olarak döker çıkış sırası

örnek kod:

>>> import json
>>> json_stringv json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

Sorun değil insan okunabilir. Ya da JSON dökümleri ile metin dosyalarını doğrula bile düzenlemek istiyorum (akıllı) kullanıcılar. (ve yerine kullanın XML değil) istiyorum

Bir şekilde seri hale getirmek için utf-8 içine nesneleri string (\uXXXX) yerine json var mı ?

bu yardımcı olmuyor.

>>> output = json_string.decode('string-escape')
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

buçalışır, amaeğer alt nesneleri herhangi bir python unicode ve utf-8 değil ise bir çöplük olacak:

>>> #### ok:
>>> s= json.dumps( "ברי צקלה", ensure_ascii=False)    
>>> print json.loads(s)   
ברי צקלה

>>> #### NOT ok:
>>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
>>> print d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 
 2: u'\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94'}
>>> s = json.dumps( d, ensure_ascii=False, encoding='utf8')
>>> print json.loads(s)['1']
ברי צקלה
>>> print json.loads(s)['2']
××¨× ×¦×§××

json aradım.döker belgelerine ama yararlı bir şey bulamadım.

- Çözüm (?) Edit:

Martijn Pieters tarafından: yorumlar ve yanıtlar özetle çalışacağım

(edit: 2 @Sebastian açıklama ve yaklaşık bir yıl sonra) sonra düşündüm

  1. yokhayır olabilirbir dahili json çözüm.döker.

  2. tüm dizeleri dönüştürmek gerekecekUTF8JSON-ed olmak için önce nesneyi Unicode. i'll use Mark's function that converts strings recuresively in a nested object

  3. verdiğim örnek çok fazla bilgisayar ve benim IDE ortamına bağlıdır, ve tüm bilgisayarlarda aynı şekilde çalışmaz.

Herkese teşekkür ederim :)

CEVAP
20 AĞUSTOS 2013, Salı


json.dumps() sonra değeri UTF-8 manuel: kodlamak için ensure_ascii=False anahtarı kullanın

>>> json_string = json.dumps(u"ברי צקלה", ensure_ascii=False).encode('utf8')
>>> json_string
'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
>>> print json_string
"ברי צקלה"

Eğer bu yazma için bir dosya kullanabilirsiniz io.open() yerine open() üretmek için bir dosya nesnesi kodlar Unicode değerleri için, yazmak gibi, daha sonra kullanmak json.dump() yerine yazma dosya:

with io.open('filename', 'w', encoding='utf8') as json_file:
    json.dump(u"ברי צקלה", json_file, ensure_ascii=False)

Python 3, yerleşik open() io.open() bir diğer adıdır. ensure_ascii=False bayrak üreteceği bug in the json module olduğunu unutmayınkarıştırınunicode str nesneleri. Python 2 için çözüm:

with io.open('filename', 'w', encoding='utf8') as json_file:
    data = json.dumps(u"ברי צקלה", ensure_ascii=False)
    # unicode(data) auto-decodes data to unicode if str
    json_file.write(unicode(data))

Eğer sen geçerken bayt dizeleri (tür str Python 2, bytes Python 3) kodlanmış UTF-8, emin olmak için de set encoding anahtar kelime:

>>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
>>> d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}

>>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
>>> s
u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
>>> json.loads(s)['1']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> json.loads(s)['2']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> print json.loads(s)['1']
ברי צקלה
>>> print json.loads(s)['2']
ברי צקלה

Unutmayınseninikinci örnekdeğilgeçerli bir Unicode; unicode edebi olarak, bu bayt UTF-8 verdinaslaçalışma:

>>> s = u'\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94'
>>> print s
××¨× ×¦×§××
>>> print s.encode('latin1').decode('utf8')
ברי צקלה

Latin 1 dize şifreledim göster bire bir bayt codepoints olan () UTF-8 yap sonra deşifre tek beklenen çıktıyı görürsünüz. Yanlış giriş kullandığınız JSON ve her şeyi ile ilgisi alakası yok. Sonuç Mojibake denir.

Eğer bir dize Unicode edebi değeri varsa, yanlış Kodek kullanarak deşifre oldu. Terminal yanlış yapılandırılmış veya metin editörü kod dosyası okumak için Python söylediklerini daha farklı bir Kodek kullanarak kaynak kaydedilmiş olabilir. Ya yanlış Kodek uygulanan bir kütüphane kaynağını bulmuşsundur.Bu JSON kütüphane ile bir ilgisi yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★TheCrono Official Channel★

    ★TheCrono

    3 Mayıs 2014
  • Elefant Traks

    Elefant Trak

    5 HAZİRAN 2007
  • Rhapsody

    Rhapsody

    7 ŞUBAT 2008