JSON Toolkit

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.

Iniciante~3 min de leituraPublicado em 2026-10-30Atualizado em 2026-10-30
Escaping Unicode versus mojibake real em JSON

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.

Leitura adicional