JSON Toolkit

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.

Principiante~3 min di letturaPubblicato il 2026-10-30Aggiornato il 2026-10-30
Escaping Unicode versus vero mojibake in JSON

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.

Ulteriori letture