Codificador e Decodificador de Entidades HTML
Codifique texto em entidades HTML seguras ou decodifique-as, na hora — ferramenta grátis para devs.
Seu texto fica no seu aparelho
Nada para apagar depois
Seguro para dados reais de usuários
Funciona em todo navegador moderno
Como funciona
- 1
Cole seu texto
Uma string com sinais de menor e maior, e comercial, aspas ou letras acentuadas que precisa entrar em marcação.
- 2
Escolha o contexto
Texto, valor de atributo ou codificação completa — cada um escapa um conjunto diferente de caracteres.
- 3
Copie o resultado
Cole num template, num documento XML, num feed ou no corpo de um e-mail.
Por que usar esta ferramenta
O contexto é escolha, não palpite
Escapar para texto, para valor de atributo e para URL são três trabalhos distintos, e você escolhe qual.
Codificação dupla é detectada
Uma entrada que já contém entidades é sinalizada, para você não converter um e comercial duas vezes.
Saída nomeada ou numérica
Referências numéricas funcionam em XML, feeds e SVG, onde quase nenhuma entidade nomeada existe.
Decodificação segura de ida e volta
As formas nomeada e numérica são reconhecidas, incluindo a escrita hexadecimal e entidades sem ponto e vírgula.
Honesto sobre o que o escape faz
Ele torna um texto seguro para colocar num contexto, o que é menos que tornar segura uma marcação não confiável.
Nada sai do navegador
O texto é convertido nesta página, então os chamados e nomes de cliente que você usa de exemplo continuam seus.
Não existe um único “escapar para HTML” — o contexto é que decide
Esta é a ideia que faz o resto do assunto fazer sentido. Um navegador analisa um documento em vários estados diferentes, e os caracteres capazes de encerrar o estado atual são diferentes em cada um. Dentro do texto, só `<` e `&` podem começar algo novo, então são esses dois que precisam ser escapados. Dentro de um valor de atributo entre aspas duplas, `<` é inofensivo e `"` é fatal, porque a aspa encerra o atributo. Dentro de um valor de atributo sem aspas, um espaço o encerra, e também uma tabulação, uma quebra de linha, uma crase, um sinal de igual e um sinal de maior. Dentro de um bloco `<script>`, escapar HTML não serve para absolutamente nada e o que se precisa é escapar strings de JavaScript. É por isso que uma única função `escape()` aplicada em todo lugar produz ao mesmo tempo saída quebrada e vulnerabilidade real: escapa demais onde os caracteres eram seguros e de menos onde não eram. Escolher um contexto antes de codificar não é requinte — é a decisão inteira.
Só um punhado de caracteres precisa mudar
Vale saber quão curta é a lista, porque quase todo excesso de escape vem de não saber. Os caracteres com significado sintático em HTML são `<`, `>`, `&`, `"` e o apóstrofo. Desses, `&` sempre precisa de escape porque começa uma entidade, e `<` sempre precisa porque começa uma tag. `>` é cortesia mais que exigência dentro do texto — um navegador mostra um `>` solto sem problema — embora escapá-lo seja hábito na maioria das bases de código, porque não custa nada e ajuda quando a marcação é depois processada por algo mais rígido. As duas aspas importam só dentro de valores de atributo, e só aquela que você usou como delimitador. Todo o resto, incluindo cada letra acentuada, cada caractere árabe ou chinês e cada emoji, não precisa de escape nenhum num documento UTF-8: a codificação já cuida disso. Transformar `café` em `café` é legal e quase sempre inútil, e deixa seu arquivo maior e mais difícil de pesquisar.
Til, cedilha e o hábito de escapar o que não precisa
Há um padrão que aparece em projetos em português mais que em outros e merece ser nomeado. Muitos sistemas antigos — gerenciadores de conteúdo, exportadores, templates de e-mail escritos quando ISO-8859-1 era o padrão — convertiam ã, õ, ç, á, ê e ü em entidades nomeadas, de modo que “informação” acabava gravado no banco como `informação`. Fazia sentido quando não dava para confiar que o cabeçalho de codificação chegaria intacto. Hoje é perda líquida, por razões concretas: a busca para de funcionar, porque quem digita “informação” não encontra `informação`; a ordenação alfabética quebra, porque ordena pelo `&` e não pela letra; a contagem de caracteres de um campo com limite mente, porque uma letra ocupa nove; e um leitor de tela não pronuncia o que ainda não foi decodificado. Há ainda uma armadilha clássica: `ç` sem o ponto e vírgula final decodifica assim mesmo em HTML, por compatibilidade, mas em XML é erro fatal — então a mesma string sobrevive no site e derruba o feed. A solução certa é declarar `<meta charset="utf-8">` e escrever as letras como são. Aqui a codificação completa existe como opção para quando um sistema legado obriga, não como comportamento padrão.
Codificação dupla é o defeito que esta ferramenta existe para evitar
Escapar não é idempotente, e esquecer disso produz um dos defeitos mais reconhecíveis da web. Codifique `&` uma vez e você tem `&`. Codifique o resultado de novo e você tem `&amp;`, que aparece na página como o texto literal `&`. Você já viu: títulos de página lendo “Tom & Jerry”, assuntos de e-mail com `'` no meio de uma palavra, nomes de produto cercados de `"` nos resultados de busca. Acontece porque o escape foi aplicado em duas camadas que não sabiam uma da outra — um motor de templates que escapa automaticamente, mais um controlador que escapou por precaução antes de entregar a string. A correção é nunca escapar duas vezes, e o jeito de ter certeza é escapar exatamente uma vez, no último momento possível, no ponto em que a string entra na marcação. Tudo que for guardado já escapado num banco vai acabar escapado de novo por aquilo que o exibe.
Entidades nomeadas são um recurso do HTML, não do texto
O HTML5 define mais de duas mil entidades nomeadas, das familiares ` ` e `©` a coisas como `⨂`. O XML define exatamente cinco: `<`, `>`, `&`, `"` e `'`. Essa lacuna causa uma falha específica e comum. Ponha ` ` num feed RSS, num arquivo SVG, num documento XHTML, num layout Android ou numa carga SOAP e você recebe erro de análise, porque o parser nunca ouviu falar dela e uma entidade não definida é fatal em XML em vez de apenas ignorada. A forma numérica ` ` funciona em qualquer lugar, já que não precisa de definição. Existe uma armadilha simétrica: `'` é uma das cinco do XML mas não existia no HTML4, então documentos HTML antigos e alguns clientes de e-mail a mostram como texto literal. Se uma string pode viajar entre formatos — e numa pilha moderna quase todas viajam — referências numéricas são a grafia segura.
Escapar não é sanitizar, e a diferença importa
Esses dois são confundidos o tempo todo, e é nessa confusão que moram as falhas de injeção. Escapar pega um texto e o torna seguro para ser colocado num contexto específico, para que seja exibido em vez de interpretado. Sanitizar pega marcação que deve continuar sendo marcação e remove as partes perigosas dela. Escapar um comentário antes de imprimi-lo está certo; escapar um campo de texto rico que o usuário tem permissão para formatar destrói a formatação, e a reação habitual — deixar o HTML passar sem escape — é o que de fato abre o buraco. O exemplo mais afiado da diferença é uma URL: codifique um link em entidades e `javascript:alert(1)` sobrevive completamente intacto, porque a decodificação de entidades acontece antes de o esquema ser verificado, então `javascript:` volta a ser `javascript:` e roda. Nenhuma quantidade de escape HTML protege um `href`; só validar o esquema protege. Escapar resolve exatamente um problema, e saber qual é o ponto.
Erros comuns que vale evitar
- Usar uma única função de escape em todo lugar. Texto, valores de atributo e blocos de script terminam em caracteres diferentes, então uma só função escapa demais num lugar e de menos em outro.
- Escapar a mesma string duas vezes. Escapar não é idempotente: `&` vira `&` e depois `&amp;`, e é por isso que títulos acabam lendo “Tom & Jerry”.
- Guardar til e cedilha como entidades no banco. Quebra a busca e a ordenação; a solução é `<meta charset="utf-8">` e escrever as letras como são.
- Pôr entidades nomeadas em XML. Lá só cinco são definidas, então ` ` é erro fatal de análise num feed, num SVG ou num XHTML, enquanto ` ` funciona em qualquer lugar.
- Confiar que codificar entidades torna uma URL segura. Entidades são decodificadas antes de o esquema ser verificado, então `javascript:` volta a ser `javascript:` e roda.
Comparação
| Item | Esta ferramenta | Codificadores online | Uma biblioteca da linguagem |
|---|---|---|---|
| Texto enviado a um servidor | Nunca | Geralmente sim | Não |
| Deixa você escolher o contexto | Sim | Raramente | Geralmente |
| Avisa sobre codificação dupla | Sim | Não | Não |
| Saída numérica para XML | Sim | Às vezes | Configurável |
| Decodifica todo o conjunto do HTML5 | Sim | Parcialmente | Geralmente |
| Preço | Grátis | Grátis / planos pagos | Grátis |
Recursos
Codificar e decodificar
Os dois sentidos, para conferir o que um sistema produziu com a mesma facilidade com que prepara o que vai enviar.
Codificação mínima ou completa
Escape só os caracteres que o contexto exige, ou todo caractere fora do ASCII, conforme o destino do texto.
Suporte a entidades nomeadas
Todo o conjunto nomeado do HTML5 é reconhecido na decodificação, inclusive a cauda longa que ninguém digita à mão.
Hexadecimal e decimal
Referências numéricas são lidas e escritas nas duas grafias, porque documentos reais trazem as duas.
Detecção de codificação dupla
Entidades já presentes na entrada são destacadas antes de você codificá-las uma segunda vez.
Entradas grandes suportadas
Um template inteiro ou uma exportação longa converte sem upload nem teto de tamanho.
Nada para instalar
Sem ferramenta de build, sem runtime, sem dependências — funciona na página web.
Compatível com árabe e RTL
Interface completa em oito idiomas, incluindo árabe da direita para a esquerda.
Seguro por padrão
Servido por HTTPS, sem rastreio de conteúdo e sem envio a terceiros.
Quem usa
Desenvolvedores web
Conferir como uma string vai se comportar depois de entrar num valor de atributo.
Desenvolvedores de e-mail
Preparar assuntos e corpos de mensagem para clientes que analisam com rigor.
Redatores técnicos
Mostrar exemplos de código numa página sem o navegador tentar executá-los.
Quem depura texto corrompido
Decodificar uma string que chegou com `&amp;` no meio dela.
Perguntas Frequentes
Não. Tudo roda localmente no seu navegador — seu texto nunca é enviado, armazenado ou compartilhado.
Sim — totalmente grátis, sem conta e sem limites.