Como codificar HTML em Base64
- Cole o markup em Entrada · texto, ou clique em Exemplo para um documento pequeno.
- Copie o Base64 de Saída · Base64.
- Mantenha Charset em UTF-8 e declare UTF-8 no data URI ou no documento (veja abaixo).
- Acrescente
data:text/html;charset=utf-8;base64,no início se precisar de um data URI, ou cole o Base64 puro no campo da API que o pediu.
O exemplo <!doctype html> mais <h1>Hello from base64hub</h1>, em duas linhas, vira PCFkb2N0eXBlIGh0bWw+CjxoMT5IZWxsbyBmcm9tIGJhc2U2NGh1YjwvaDE+. O Base64 para HTML faz o caminho inverso.
Exemplos
| HTML | Base64 |
|---|---|
<h1>Hi</h1> | PGgxPkhpPC9oMT4= |
<p>café</p> | PHA+Y2Fmw6k8L3A+ |
<b>Total: 5 €</b> | PGI+VG90YWw6IDUgJmV1cm87PC9iPg== |
Entidades como € são só texto para o Base64 e ficam como estão; o navegador as resolve depois de decodificar. Uma string que começa com PCFkb2N0eXBl ou PCFET0NUWVBF é um documento HTML (<!doctype ou <!DOCTYPE), e PGh0bWw é <html.
Montar um URI data:text/html
Um data URI completo tem quatro partes: o esquema, o media type, um charset opcional e a marcação de Base64.
data:text/html;charset=utf-8;base64,PHA+Y2Fmw6k8L3A+
Sem charset=utf-8 no URI nem <meta charset="utf-8"> no documento, o navegador pode ler os bytes numa codificação legada, e café aparece como café. Colocar a meta tag dentro do HTML protege o documento onde quer que ele vá parar.
Usos típicos:
- Num iframe,
<iframe src="data:text/html;base64,...">mostra um trecho autossuficiente sem arquivo separado. Para HTML escrito à mão, o atributosrcdoccostuma ser mais simples, porque não exige codificação nenhuma. - Testes de navegador e outras automações podem carregar uma página de fixture a partir de um data URI sem servidor web.
- Algumas APIs de e-mail, de renderização de PDF e de documentos aceitam o corpo HTML como campo Base64, para que aspas e quebras de linha não precisem de escape no JSON.
Os navegadores não deixam uma página web navegar a janela principal para uma URL data:text/html, então links e redirecionamentos para uma delas falham em silêncio ou mostram um erro. Iframes não são afetados.
Tamanho e alternativas
O Base64 deixa o markup cerca de um terço maior: o documento de 49 bytes <!doctype html><meta charset="utf-8"><p>café</p> vira 68 caracteres. Para HTML quase todo em ASCII, um data URI com percent-encoding costuma ser mais curto, porque só alguns caracteres, como #, % e bytes não ASCII, precisam de escape. O Base64 é a escolha mais segura quando o markup é grande, tem muitos caracteres especiais ou vai para um campo que só aceita Base64. O gerador de data URI monta links data: para HTML, CSS e imagens, e desempenho de data URIs trata de cache e de trade-offs de tamanho.
HTML para Base64 no código
import base64
html = '<!doctype html><meta charset="utf-8"><p>café</p>'
uri = "data:text/html;charset=utf-8;base64," + base64.b64encode(html.encode("utf-8")).decode()
// Node.js
const html = "<p>café</p>";
const uri = "data:text/html;charset=utf-8;base64," + Buffer.from(html, "utf8").toString("base64");
// "data:text/html;charset=utf-8;base64,PHA+Y2Fmw6k8L3A+"
No navegador, use a abordagem com TextEncoder de Base64 em JavaScript, já que o btoa sozinho embaralha ou rejeita caracteres não ASCII. Veja também Base64 em Python.
Perguntas frequentes
Como criar um data URI a partir de HTML?
Codifique o HTML aqui e coloque o resultado depois de data:text/html;charset=utf-8;base64,. Por exemplo, <h1>Hi</h1> vira data:text/html;charset=utf-8;base64,PGgxPkhpPC9oMT4=.
Por que meu link data:text/html não abre a partir de uma página?
Os navegadores atuais impedem que páginas web levem a janela principal para uma URL data:text/html, uma medida contra phishing. Carregue-a num iframe, ou abra colando você mesmo na barra de endereços.
Base64 é a mesma coisa que codificação HTML?
Não. A codificação HTML (entidades) transforma < em < para que o markup apareça como texto. O Base64 transforma o documento inteiro em letras e dígitos para transporte. Para entidades, use a ferramenta de entidades HTML.
O Base64 esconde meu código HTML?
Não. Qualquer pessoa o decodifica em segundos, e o navegador precisa decodificá-lo de qualquer forma para renderizar.