Como escapar ou desfazer o escape de HTML
- Escolha Escapar ou Desfazer escape.
- Para escapar, escolha o que escapar em Escapar:
- Só & < > " ‘ para HTML que você vai colar numa página ou num template.
- Mais todos os não ASCII para páginas, e-mails ou sistemas que não lidam bem com UTF-8.
- Todos os caracteres para codificar todo o texto, para testar parsers.
- Escolha o Formato: Nomeadas (é), Decimais (é) ou Hex (é). O nomeado usa a forma decimal para caracteres que não têm um nome comum. Desmarque Escapar aspas se o texto só vai para o conteúdo de elementos.
- Clique em Copiar saída. Inverter leva o resultado para o outro lado, para conferir a ida e volta.
Desfazer o escape usa o parser HTML do navegador, então todas as mais de 2.000 referências nomeadas do HTML5 são suportadas, junto com as referências decimais e hex. A entrada nunca é renderizada como HTML.
Entidades comuns
| Caractere | Nomeada | Decimal | Hex |
|---|---|---|---|
& | & | & | & |
< | < | < | < |
> | > | > | > |
" | " | " | " |
' | ' (HTML5) | ' | ' |
| espaço não separável | |   |   |
é | é | é | é |
— | — | — | — |
€ | € | € | € |
© | © | © | © |
😀 | nenhuma | 😀 | 😀 |
Referências numéricas usam o code point Unicode. O emoji ocupa quatro bytes em UTF-8, mas só uma referência.
Armadilhas ao escapar e decodificar
- Escape o
&primeiro. Trocar<por<e depois&por&gera&lt;. Qualquer escape escrito à mão precisa tratar o&antes dos outros. - Um
&sem escape no texto pode virar símbolo. O HTML ainda reconhece algumas entidades legadas sem ponto e vírgula, então o texto?id=1©=2¶=3aparece como?id=1©=2¶=3. Escreva&para todo e comercial, inclusive em URLs. - Escape duplo aparece como
&lt;b&gt;na página. Desfaça o escape uma vez e depois descubra qual camada escapa duas vezes. não é espaço. Ele decodifica para U+00A0, que parece um espaço mas falha em comparações de strings e notrim()de algumas linguagens.- Entidades não são codificação de URL. Num link,
&separa parâmetros de query no código-fonte HTML, enquanto%26é um e comercial literal dentro de um valor. O codificador de URL cuida do segundo caso.
Escapar e desfazer o escape no código
import html
html.escape('5 > 3 & "quotes"') # '5 > 3 & "quotes"'
html.unescape("Café — ©") # 'Café — ©'
const escapeHtml = s => s.replace(/&/g, "&").replace(/</g, "<")
.replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
const unescapeHtml = s =>
new DOMParser().parseFromString(s, "text/html").documentElement.textContent;
O html.escape do Python escapa aspas por padrão e escreve ' como '. No PHP, a escolha habitual é htmlspecialchars(); desde o PHP 8.1 ele escapa os dois tipos de aspas por padrão. O DOMParser não executa scripts no documento analisado, o que o torna uma forma segura de decodificar no navegador. Para mais sobre strings em JavaScript, veja a página de JavaScript.
Entidades, Base64 e data URIs
Entidades HTML e Base64 resolvem problemas diferentes. Entidades deixam caracteres seguros dentro do código-fonte HTML; o Base64 transforma bytes em texto para que um arquivo inteiro caiba num atributo. Para embutir um documento HTML completo num URI data: ou num campo JSON, codifique-o com o HTML para Base64 em vez de escapar cada caractere.
Perguntas frequentes
Quais caracteres precisam de escape no HTML?
No conteúdo de texto, & e <, e > por convenção. Dentro de valores de atributo, também a aspa que delimita o valor, " ou '. Todo o resto, inclusive letras acentuadas e emoji, pode ficar como está numa página UTF-8.
Qual a diferença entre ' e '?
Os dois significam o apóstrofo. ' está definido no HTML5 e no XML, mas faltava no HTML 4, então ' é a forma que funciona em todo parser e cliente de e-mail. O escape aqui usa '.
Por que aparece &amp; na minha página?
O texto passou por escape duas vezes: & virou &, e uma segunda passada transformou isso em &amp;. Desfaça o escape uma vez aqui para obter o texto pretendido e remova a etapa extra, geralmente um template engine escapando um valor que já tinha sido escapado.
Escapar entidades HTML evita XSS?
Evita injeção em texto HTML e em valores de atributo entre aspas. Não deixa os dados seguros dentro de blocos <script>, URLs javascript:, CSS ou atributos sem aspas; esses contextos precisam da própria codificação. Prefira o escape automático do seu template engine.