Codificador e decodificador de entidades HTML
Escape os caracteres que de outra forma seriam lidos como marcação, ou decodifique uma string que chegou cheia de & e ’. Emoji e os demais caracteres acima de U+FFFF saem como uma única entidade, e não como duas metades quebradas.
A primeira opção escapa cinco caracteres e deixa seus acentos e travessões como texto real, que é o que você quer em uma página UTF-8.
Só é usado quando não existe entidade nomeada para o caractere. As duas são entendidas em todo lugar.
Três formas de escrever o mesmo caractere
Uma referência de entidade é um jeito de escrever um caractere usando apenas ASCII simples. Existem três formas e os navegadores tratam todas de forma idêntica: nomeada (&), decimal (&) e hexadecimal (&). As três produzem um E comercial. As referências nomeadas são legíveis; as numéricas sempre existem, até para os caracteres que ninguém se deu ao trabalho de nomear.
Na prática você só precisa de cinco
Em uma página que declara <meta charset="utf-8">, você pode digitar um travessão, uma letra acentuada ou um emoji direto no código-fonte e ele vai aparecer. O que você não pode digitar direto é qualquer coisa que o analisador leria como marcação:
&— sempre, em todo lugar. Um E comercial sem escape seguido de letras pode ser engolido como uma entidade, entãoTom & Jerrynão é preciosismo opcional.<— sempre no conteúdo de texto. É o que começa uma tag.>— por convenção mais do que por necessidade, mas escapar não custa nada e evita surpresas nos casos extremos."e'— dentro dos valores de atributo, aquela que você usou como aspas. Escapar as duas significa nunca ter que pensar em qual foi.
Escape esses cinco e o texto fica seguro nos nós de texto HTML e nos atributos entre aspas. É isso que o primeiro modo acima faz. Os outros dois modos existem para quando você não pode confiar na codificação de todos os sistemas por onde um arquivo vai passar.
Por que o apóstrofo sai como número
Esta ferramenta escreve ' em vez de '. A forma nomeada está definida em XML e em HTML5, mas não fazia parte do HTML 4, então analisadores antigos e um número surpreendente de clientes de e-mail a mostram como o texto literal '. A referência numérica sempre funcionou. São quatro caracteres a mais e uma coisa a menos para depurar.
Escapar não é sanitizar, e o contexto decide tudo
O escape de cinco caracteres está certo para o texto HTML e para os valores de atributo entre aspas. Não está certo, nem seguro, em nenhum outro lugar:
- Atributos sem aspas.
<div class=VALOR>termina no primeiro espaço, então escapar as aspas não te serve de nada. Coloque aspas nos seus atributos. - Dentro de
<script>. Isso é um contexto de string JavaScript. Ali as referências de entidade não são decodificadas, e a sequência</script>dentro de uma string ainda vai encerrar o bloco. - Dentro de um atributo de URL. As entidades são decodificadas antes de a URL ser analisada, então
javascript:alert(1)sobrevive intacto ao escape de entidades e vira um linkjavascript:. Valide o esquema; não confie no escape. - Dentro de CSS. De novo, outras regras de escape.
E escapar não é remover. Esta ferramenta faz a marcação aparecer como texto. Ela não remove nada perigoso, porque não precisa: nada sobrevive como marcação. Se você quer manter algumas tags e descartar outras, isso é sanitizar, e exige um analisador com uma lista de tags permitidas.
Emoji, pares substitutos e aquela saída quebrada que você já viu
Os caracteres acima de U+FFFF —emoji, CJK raro, quase todas as escritas históricas— são guardados em JavaScript como duas unidades de código. Um escapador que percorre uma string índice por índice emite duas referências inúteis como ��, que nenhum analisador consegue remontar no caractere original. Esta ferramenta itera por ponto de código, então um rosto sorridente vira a referência única 😀.
O que o decodificador faz e o que não faz
A decodificação aqui usa o próprio analisador de HTML do navegador, o que significa que ela segue as regras do HTML5 — inclusive as herdadas. O HTML5 decodifica uma lista de cerca de cem entidades antigas mesmo sem o ponto e vírgula final, então © vira um sinal de copyright. Um analisador de XML rejeitaria isso na hora. Se você está levando conteúdo de ida e volta por RSS, SVG ou um arquivo de configuração XML, lembre que o XML define exatamente cinco entidades nomeadas —amp, lt, gt, quot e apos— e todo o resto tem que ser numérico.
Mais dois limites que vale conhecer. As referências não reconhecidas passam sem alteração em vez de gerar um erro, exatamente como um navegador as renderizaria, então um erro de digitação no nome de uma entidade é invisível aqui. E os caracteres de controle abaixo de U+0020 são deixados como estão em todos os modos, porque referências numéricas para a maioria deles não são HTML válido: se o seu texto contém esses caracteres, o problema está antes do escape.
Perguntas frequentes
Quais caracteres eu preciso escapar em HTML?
O E comercial e o sinal de menor que sempre, o maior que por convenção, e a aspa que você usou em volta de um valor de atributo. Escapar os cinco cobre os nós de texto e os atributos entre aspas, que é onde acontece quase toda injeção de HTML.
Ainda preciso de entidades para caracteres acentuados?
Não, não em uma página UTF-8, que hoje é toda página. Digite direto. As entidades continuam úteis para caracteres invisíveis ou ambíguos no código-fonte, como um espaço não separável ou um hífen opcional.
Por que isso escreve ' em vez de '?
Porque ' nunca fez parte do HTML 4. Funciona em HTML5 e em XML, mas analisadores antigos e vários clientes de e-mail mostram como texto literal. A forma numérica funciona em todo lugar.
Escapar HTML é suficiente para impedir XSS?
Só no texto HTML e nos valores de atributo entre aspas. Não faz nada dentro de um bloco script, dentro de um atributo de URL nem em CSS: uma URL javascript: sobrevive intacta ao escape de entidades. Escape para o contexto em que você realmente está escrevendo.
Por que um emoji vira uma entidade aqui e duas em outro lugar?
Porque emoji ficam acima de U+FFFF e o JavaScript os guarda como duas unidades de código. Ferramentas que percorrem os índices da string emitem duas referências quebradas. Esta itera por ponto de código e emite uma única referência correta.
Última atualização 19 de setembro de 2026