Por que o chinês vira \u4e2d\u6587
Resumo: Um escape `\u4e2d\u6587` é Unicode legal, não falha de codificação. O mojibake real parece diferente, e distingui-los decide o que você realmente precisa corrigir.

Resumo da ópera: trate a saída \uXXXX como escape legal, confirme que ela faz ida e volta pelo JSON.parse, e desligue a serialização em ASCII puro, como ensure_ascii=False, quando quiser chinês legível; mantenha o escaping apenas para transportes que não conseguem carregar não-ASCII.
Porque foi escapado, não danificado.
JSON.parse('"\\u4e2d\\u6587"') // "中文"
\u4e2d é 中 e \u6587 é 文. São sequências de escape legais; qualquer analisador as restaura. Nada está quebrado — só fica ilegível em logs, diffs e capturas de pacotes.
Quem faz o escaping
| Ferramenta | Padrão | Alternância |
|---|---|---|
json.dumps do Python |
Escapa (ensure_ascii=True) |
ensure_ascii=False |
JSON.stringify do JavaScript |
Sem escaping | — |
| Jackson do Java | Sem escaping | Opcional |
json_encode do PHP |
Sem escaping desde 5.4 | — |
encoding/json do Go |
Sem escaping | — |
O Python é de longe a origem mais comum. O padrão existe por um motivo: a saída em ASCII puro sobrevive a qualquer transporte. O custo é que todo caractere não-ASCII se torna seis caracteres.
Escaping versus mojibake
Escaping: \u4e2d\u6587, correspondendo a \uXXXX. Causado por configurações do serializador.
Mojibake: 测试, 涓枃. Causado por gravar bytes UTF-8 e lê-los como Latin-1 ou GBK.
Teste rápido: cole o texto no console do navegador como JSON.parse('"…"'). Se voltar legível, era escaping. Se falhar ou continuar embaralhado, é incompatibilidade de codificação — e a correção é alinhar as codificações, não mexer no serializador.
Desligando
json.dumps(data, ensure_ascii=False)
Depois verifique a jusante: alguns sistemas legados realmente dependem de transporte somente ASCII, particularmente gateways de SMS e relays de e-mail mais antigos.
Quando o escaping é a escolha certa
- Transportes hostis a não-ASCII (cabeçalhos HTTP legados, alguns gateways de SMS)
- JSON aninhado dentro de outra string JSON, onde o escaping reduz conflitos de aspas
- Pipelines de log que truncam por bytes e dividiriam um caractere multibyte
Caso contrário, prefira a legibilidade e desligue.
Perguntas frequentes
Por que o Python escapa o chinês por padrão?
Porque ensure_ascii=True é o padrão, o que garante saída em ASCII puro que sobrevive a qualquer transporte. O custo é que todo caractere não-ASCII se torna seis caracteres.
Devo desligar ensure_ascii?
Desligue quando a legibilidade importar. Depois verifique a jusante — cabeçalhos HTTP legados, alguns gateways de SMS e pipelines de log que truncam por bytes ainda podem depender de conteúdo somente ASCII.
O que acontece se o transporte não consegue carregar não-ASCII?
Mantenha o escaping. Quando JSON é embutido dentro de outra string JSON, ou trafega por um canal hostil a não-ASCII, o escaping evita conflitos de aspas e impede que caracteres multibyte sejam divididos.