KeroTools

Codificador e Decodificador de Entidades HTML

Codifique texto em entidades HTML seguras ou decodifique-as, na hora — ferramenta grátis para devs.

Entrada
0 caracteres
Saída

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. 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. 2

    Escolha o contexto

    Texto, valor de atributo ou codificação completa — cada um escapa um conjunto diferente de caracteres.

  3. 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&eacute;` é 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&ccedil;&atilde;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&ccedil;&atilde;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: `&ccedil` 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 `&amp;`. Codifique o resultado de novo e você tem `&amp;amp;`, que aparece na página como o texto literal `&amp;`. Você já viu: títulos de página lendo “Tom &amp; Jerry”, assuntos de e-mail com `&#39;` no meio de uma palavra, nomes de produto cercados de `&quot;` 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 `&nbsp;` e `&copy;` a coisas como `&bigotimes;`. O XML define exatamente cinco: `&lt;`, `&gt;`, `&amp;`, `&quot;` e `&apos;`. Essa lacuna causa uma falha específica e comum. Ponha `&nbsp;` 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 `&#160;` funciona em qualquer lugar, já que não precisa de definição. Existe uma armadilha simétrica: `&apos;` é 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 `&#106;avascript:` 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 `&amp;` e depois `&amp;amp;`, e é por isso que títulos acabam lendo “Tom &amp; 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 `&nbsp;` é erro fatal de análise num feed, num SVG ou num XHTML, enquanto `&#160;` funciona em qualquer lugar.
  • Confiar que codificar entidades torna uma URL segura. Entidades são decodificadas antes de o esquema ser verificado, então `&#106;avascript:` volta a ser `javascript:` e roda.

Comparação

ItemEsta ferramentaCodificadores onlineUma biblioteca da linguagem
Texto enviado a um servidorNuncaGeralmente simNão
Deixa você escolher o contextoSimRaramenteGeralmente
Avisa sobre codificação duplaSimNãoNão
Saída numérica para XMLSimÀs vezesConfigurável
Decodifica todo o conjunto do HTML5SimParcialmenteGeralmente
PreçoGrátisGrátis / planos pagosGrá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;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.