Perché il cinese diventa \u4e2d\u6587
In sintesi: Un escape \u4e2d\u6587 è Unicode legale, non un errore di codifica. Il vero mojibake ha un aspetto diverso, e distinguerli determina cosa devi davvero correggere.

In sintesi: tratta l'output \uXXXX come escaping legale, conferma che fa un round-trip attraverso JSON.parse, e disattiva la serializzazione ad ASCII puro come ensure_ascii=False quando vuoi il cinese leggibile; mantieni l'escaping solo per i trasporti che non possono veicolare caratteri non ASCII.
Perché è stato sottoposto a escape, non danneggiato.
JSON.parse('"\\u4e2d\\u6587"') // "中文"
\u4e2d è 中 e \u6587 è 文. Sono sequenze di escape legali; qualsiasi parser le ripristina. Nulla è rotto — è solo illeggibile in log, diff e catture di pacchetti.
Chi esegue l'escaping
| Strumento | Default | Interruttore |
|---|---|---|
Python json.dumps |
Esegue escape (ensure_ascii=True) |
ensure_ascii=False |
JavaScript JSON.stringify |
Nessun escape | — |
| Java Jackson | Nessun escape | Opzionale |
PHP json_encode |
Nessun escape dalla 5.4 | — |
Go encoding/json |
Nessun escape | — |
Python è di gran lunga la fonte più comune. Il default esiste per una ragione: l'output in ASCII puro sopravvive a qualsiasi trasporto. Il costo è che ogni carattere non ASCII diventa sei caratteri.
Escaping versus mojibake
Escaping: \u4e2d\u6587, corrisponde a \uXXXX. Causato dalle impostazioni del serializzatore.
Mojibake: 测试, 涓枃. Causato dalla scrittura di byte UTF-8 e dalla loro lettura come Latin-1 o GBK.
Test rapido: incolla il testo in una console del browser come JSON.parse('"…"'). Se torna leggibile, era escaping. Se fallisce o resta illeggibile, è un disallineamento di codifica — e la correzione è allineare le codifiche, non toccare il serializzatore.
Disattivarlo
json.dumps(data, ensure_ascii=False)
Poi verifica a valle: alcuni sistemi legacy si affidano davvero al trasporto solo ASCII, in particolare gateway SMS e relay di posta più vecchi.
Quando l'escaping è la scelta giusta
- Trasporti ostili ai caratteri non ASCII (header HTTP legacy, alcuni gateway SMS)
- JSON annidato dentro un'altra stringa JSON, dove l'escaping riduce i conflitti di virgolette
- Pipeline di log che troncano per byte e spezzerebbero un carattere multibyte
Altrimenti, preferisci la leggibilità e disattivalo.
FAQ
Perché Python fa l'escape del cinese per impostazione predefinita?
Perché ensure_ascii=True è il default, il che garantisce un output in ASCII puro che sopravvive a qualsiasi trasporto. Il costo è che ogni carattere non ASCII diventa sei caratteri.
Devo disattivare ensure_ascii?
Disattivalo quando conta la leggibilità. Poi verifica a valle — header HTTP legacy, alcuni gateway SMS e pipeline di log che troncano per byte possono ancora affidarsi a contenuti solo ASCII.
Cosa succede se il trasporto non può veicolare caratteri non ASCII?
Mantieni l'escaping. Quando JSON è incorporato dentro un'altra stringa JSON, o viaggia su un canale ostile ai caratteri non ASCII, l'escaping evita conflitti di virgolette e impedisce che i caratteri multibyte vengano spezzati.