przykładowy kod:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Problem: nie jest czytelny dla człowieka. Moi (inteligentni) użytkownicy chcą weryfikować, a nawet edytować pliki tekstowe za pomocą zrzutów JSON (i wolałbym nie używać XML).
Czy istnieje sposób szeregowania obiektów w ciągi JSON UTF-8 (zamiast \uXXXX
)?
Odpowiedzi:
Użyj
ensure_ascii=False
przełącznika dojson.dumps()
, a następnie ręcznie zakoduj wartość do UTF-8:Jeśli piszesz do pliku, po prostu użyj
json.dump()
i pozostaw obiektowi pliku do zakodowania:Ostrzeżenia dotyczące Python 2
W przypadku Pythona 2 należy wziąć pod uwagę kilka dodatkowych zastrzeżeń. Jeśli piszesz to do pliku, możesz użyć
io.open()
zamiastopen()
do wytworzenia obiektu pliku, który koduje wartości Unicode podczas pisania, a następnie użyjjson.dump()
zamiast tego do zapisu do tego pliku:Należy pamiętać, że istnieje błąd w
json
module , gdzieensure_ascii=False
flaga może wytworzyć mieszankę zunicode
istr
obiektów. Obejściem dla Python 2 jest zatem:W Pythonie 2, używając ciągów bajtów (typ
str
), zakodowanych w UTF-8, upewnij się również, że ustawiłeśencoding
słowo kluczowe:źródło
Aby zapisać do pliku
Aby wydrukować na standardowe wyjście
źródło
codecs
biblioteki. Dzięki!AKTUALIZACJA: To zła odpowiedź, ale nadal warto zrozumieć, dlaczego jest zła. Zobacz komentarze.
Jak o
unicode-escape
?źródło
unicode-escape
nie jest konieczne: możesz użyćjson.dumps(d, ensure_ascii=False).encode('utf8')
zamiast tego. I nie ma gwarancji, że json we wszystkich przypadkach używa dokładnie takich samych reguł jakunicode-escape
kodek w Pythonie, tzn. Wynik może, ale nie musi być taki sam w niektórych przypadkach narożnych. Głosowanie dotyczy niepotrzebnej i prawdopodobnie złej konwersji. Niepowiązane: działa tylko dla ustawień regionalnych utf8 lub jeśli envvar określa tutaj utf8 (zamiast tego wypisuje Unicode).print json_str
PYTHONIOENCODING
json.dumps(d, ensure_ascii=False).encode('utf8')
przynajmniej dla mnie nie działa. Dostaję -UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
błąd. Jednakunicode-escape
wariant działa dobrze.Obejście Petersa w python 2 kończy się niepowodzeniem w przypadku krawędzi:
Wystąpił awaria w części .decode ('utf8') wiersza 3. Naprawiłem problem, czyniąc program o wiele prostszym, unikając tego kroku, a także specjalnej obudowy ascii:
źródło
unicode(data)
podejście jest lepszą opcją niż używanie obsługi wyjątków. Zauważ, żeencoding='utf8'
argument słowa kluczowego nie ma nic wspólnego zjson.dumps()
produkowanym wyjściem ; służy do dekodowaniastr
wejścia odbieranego przez funkcję.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
Działa, czydumps
zwraca obiekt (tylko ascii) str lub obiekt Unicode.str.encode('utf8')
dekoduje domyślnie. Ale tak się stanieunicode(data)
, jeśli danystr
przedmiot. :-) Używanieio.open()
daje jednak więcej opcji, w tym użycie kodeka, który zapisuje BOM i śledzisz dane JSON czymś innym..encode('utf8')
wariant oparty na Pythonie 2 i 3 (ten sam kod). Wunicode
Pythonie 3 nie ma żadnych danych . Niepowiązane: pliki json nie powinny używać BOM (chociaż parser potwierdzający json może zignorować BOM, patrz błąd 3983 ).encoding='utf8'
celujson.dumps
rozwiązania problemu. PS Mam tekst cyrylicy do zrzuceniaW Pythonie 3.7 następujący kod działa poprawnie:
Wynik:
źródło
Oto moje zrozumienie var czytanie powyżej odpowiedzi i google.
źródło
Oto moje rozwiązanie za pomocą json.dump ():
gdzie SYSTEM_ENCODING jest ustawiony na:
źródło
Jeśli to możliwe, używaj kodeków,
źródło
Dzięki za oryginalną odpowiedź tutaj. W Pythonie 3 następujący wiersz kodu:
było ok. Zastanów się, czy nie pisać zbyt dużo tekstu w kodzie, jeśli nie jest to konieczne.
Może to być wystarczające dla konsoli Pythona. Jednak, aby spełnić wymagania serwera, może być konieczne ustawienie ustawień regionalnych, jak wyjaśniono tutaj (jeśli jest na Apache2) http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
w zasadzie zainstaluj he_IL lub dowolny język w Ubuntu, sprawdź, czy nie jest zainstalowany
zainstaluj go tam, gdzie XX jest twoim językiem
Na przykład:
dodaj następujący tekst do / etc / apache2 / envvrs
Miejmy nadzieję, że nie dostaniesz błędów Pythona z Apache, takich jak:
Również w Apache spróbuj ustawić utf jako domyślne kodowanie, jak wyjaśniono tutaj:
Jak zmienić domyślne kodowanie na UTF-8 dla Apache?
Zrób to wcześnie, ponieważ błędy apache mogą być problematyczne w debugowaniu i możesz błędnie pomyśleć, że pochodzi od Pythona, co prawdopodobnie nie ma miejsca w takiej sytuacji
źródło
Jeśli ładujesz ciąg JSON z pliku i jego zawartości, teksty arabskie. To zadziała.
Załóżmy, że plik taki jak: arabic.json
Pobierz arabską zawartość z pliku arabic.json
Aby użyć danych JSON w szablonie Django, wykonaj następujące kroki:
źródło
fh.close()
fh
jest niezdefiniowany.f.close()
użyj opcji unicode, aby rozwiązać problem
wyjaśnić
oryginalny zasób :https://blog.csdn.net/chuatony/article/details/72628868
źródło
Używanie sure_ascii = False w json.dumps jest właściwym kierunkiem do rozwiązania tego problemu, jak zauważył Martijn. Może to jednak powodować wyjątek:
Potrzebujesz dodatkowych ustawień w site.py lub sitecustomize.py, aby ustawić poprawność sys.getdefaultencoding (). site.py znajduje się w lib / python2.7 /, a sitecustomize.py jest w lib / python2.7 / site-packages.
Jeśli chcesz użyć site.py, w ramach def setencoding (): zmień pierwszy if 0: na if 1: aby python używał ustawień regionalnych twojego systemu operacyjnego.
Jeśli wolisz używać sitecustomize.py, który może nie istnieć, jeśli go nie utworzyłeś. po prostu wstaw te linie:
Następnie możesz wykonać jakieś chińskie wyjście json w formacie utf-8, takie jak:
Otrzymasz łańcuch zakodowany w utf-8, a nie łańcuch znaków json.
Aby zweryfikować domyślne kodowanie:
Powinieneś dostać „utf-8” lub „UTF-8”, aby zweryfikować ustawienia site.py lub sitecustomize.py.
Pamiętaj, że nie można wykonać sys.setdefaultencoding („utf-8”) w interaktywnej konsoli Pythona.
źródło
json
„s”ensure_ascii=False
. Podaj minimalny pełny przykład kodu, jeśli uważasz inaczej.