Como codificar texto em Base64
- Digite ou cole o texto na caixa Entrada · texto. A página abre com um exemplo; clique em Limpar para começar do zero.
- O Base64 aparece em Saída · Base64 enquanto você digita. Para entradas muito grandes, desmarque Ao vivo e clique em Executar.
- Ajuste as opções que o sistema de destino espera: URL-safe (- _), Sem preenchimento (=), Quebra de linha e Charset. Os padrões (alfabeto padrão, com preenchimento, uma linha, UTF-8) servem para a maioria das APIs.
- Clique em Copiar saída, ou em Baixar para salvar o resultado como
base64.txt. - Para conferir a ida e volta, clique em Inverter. O Base64 vai para a entrada e a ferramenta passa a decodificar.
Abaixo dos botões aparecem o tamanho da entrada em bytes, o tamanho da saída e a variação percentual, o que ajuda quando um campo tem limite de tamanho.
Como funciona a codificação Base64
O Base64 trabalha com bytes, então o primeiro passo é transformar o texto em bytes com um charset (aqui, UTF-8, a menos que você escolha outro). O codificador pega os bytes de três em três, ou seja, 24 bits, divide em quatro números de 6 bits e escreve cada número como um caractere de um alfabeto de 64: A–Z, a–z, 0–9, + e /.
O exemplo clássico é o texto Man: os bytes 4D 61 6E viram TWFu. Quando o último grupo tem só um ou dois bytes, a saída é completada com =: Ma vira TWE= e M vira TQ==. O passo a passo completo está em como o Base64 funciona, e preenchimento explicado mostra quando o = pode ser omitido.
O tamanho da saída é sempre 4 × ⌈n / 3⌉ caracteres para n bytes, cerca de 33% a mais que a entrada. A calculadora de tamanho Base64 faz essa conta para qualquer tamanho, e o custo de tamanho do Base64 explica quando isso importa. Qualquer pessoa consegue reverter o Base64, então ele não esconde nada; leia codificação vs criptografia antes de colocar segredos nele.
Opções de codificação
| Opção | O que muda | Quando usar |
|---|---|---|
| URL-safe (- _) | + vira - e / vira _ (RFC 4648, seção 5) | URLs, query strings, nomes de arquivo, cookies, JWT. O codificador Base64URL já vem com essa opção ligada |
| Sem preenchimento (=) | Remove os caracteres = do final | JWT e a maioria dos formatos URL-safe; qualquer sistema que remova o = de qualquer jeito |
| Quebra de linha: 76 (MIME, LF ou CRLF) | Insere uma quebra de linha a cada 76 caracteres | Corpo e anexos de e-mail (codificador MIME) |
| Quebra de linha: 64 (PEM) | Insere uma quebra de linha a cada 64 caracteres | Certificados e chaves entre as linhas -----BEGIN e -----END |
| Charset | Em quais bytes cada caractere se transforma antes da codificação | UTF-8, a menos que o destino espere UTF-16, Windows-1251, Shift_JIS ou outra codificação legada |
Exemplos com Unicode, emoji e saída URL-safe
Todos os valores abaixo foram gerados com o módulo base64 do Python e batem com a saída desta ferramenta.
| Entrada | Configuração | Base64 |
|---|---|---|
Hello | UTF-8 | SGVsbG8= |
Hello, world! | UTF-8 | SGVsbG8sIHdvcmxkIQ== |
café | UTF-8 | Y2Fmw6k= |
café | ISO-8859-1 | Y2Fm6Q== |
€ | UTF-8 | 4oKs |
€ | Windows-1252 | gA== |
👋 | UTF-8 | 8J+Riw== |
👋 | UTF-8, URL-safe, sem preenchimento | 8J-Riw |
Привет | UTF-8 | 0J/RgNC40LLQtdGC |
Привет | Windows-1251 | z/Do4uXy |
A mesma palavra gera Base64 diferente em charsets diferentes porque os bytes mudam: é ocupa dois bytes (C3 A9) em UTF-8 e um byte (E9) em Latin-1. O emoji da mão acenando tem quatro bytes em UTF-8, então sozinho ocupa 8 caracteres, dois deles de preenchimento.
Charsets e caracteres que não cabem
O UTF-8 representa qualquer caractere Unicode, então nunca perde nada. Os outros 26 charsets da lista (UTF-16LE/BE, UTF-32LE, ASCII, as páginas de código ISO-8859 e Windows, KOI8-R/U, CP866, Shift_JIS, EUC-JP, GBK, Big5 e EUC-KR) existem para sistemas que os exigem. Se o texto tiver um caractere que o charset escolhido não tem, ele é trocado por ? e um aviso informa quantos caracteres foram substituídos. O € em ISO-8859-1, por exemplo, vira Pw==, que é só um ponto de interrogação.
Escolha UTF-16LE para strings do Windows e do .NET e para o PowerShell; a página UTF-16 para Base64 explica o motivo. Escolha ASCII quando o sistema precisa rejeitar tudo que não for texto de 7 bits (ASCII para Base64).
Quebra de linha
O Base64 puro é uma única linha longa, o formato de que JSON, headers HTTP, URLs e variáveis de ambiente precisam. O e-mail usa linhas de 76 caracteres (RFC 2045) e os arquivos PEM usam 64. A opção de quebra insere quebras de linha \n nessa largura, ou CRLF com 76 (MIME, CRLF). Os decodificadores, incluindo o decodificador deste site, ignoram as quebras de linha, então a saída quebrada decodifica para os mesmos bytes. Base64 em e-mail explica as regras do MIME.
Erros comuns ao codificar
- Uma quebra de linha entra de carona no final.
echo Hello | base64imprimeSGVsbG8Kporque oechoadiciona\n. O textoHellosozinho éSGVsbG8=. Useprintf '%s'e, ao colar aqui, confira se a contagem de bytes da entrada é a esperada. btoa()dá erro com Unicode. No navegador,btoa("Grüße 👋")lançaInvalidCharacterError, porque obtoasó aceita caracteres Latin-1. Converta para bytes UTF-8 antes, como no trecho abaixo.- O destino usa outro charset. Se você codifica em UTF-8 e o outro lado decodifica como Latin-1,
cafésai comocafé. Use o mesmo charset nos dois lados, ou escolha aqui o charset do destino. - Codificar duas vezes. O Base64 de
SGVsbG8=éU0dWc2JHOD0=. Se um valor decodifica para mais Base64, alguma etapa do processo codificou duas vezes. +e/quebram URLs. Numa query string, o+é lido como espaço. Use a opção URL-safe ou o codificador Base64URL, ou aplique percent-encoding no valor.
Codificar Base64 em JavaScript, Python e na linha de comando
No JavaScript do navegador, converta a string em bytes UTF-8 com TextEncoder e depois codifique os bytes. Navegadores mais novos aceitam bytes.toBase64() direto (Uint8Array.toBase64).
const bytes = new TextEncoder().encode("Grüße 👋");
let bin = "";
for (const b of bytes) bin += String.fromCharCode(b);
btoa(bin); // "R3LDvMOfZSDwn5GL"
// Node.js
Buffer.from("Grüße 👋", "utf8").toString("base64"); // "R3LDvMOfZSDwn5GL"
Buffer.from("👋", "utf8").toString("base64url"); // "8J-Riw"
Em Python, b64encode recebe bytes e devolve bytes:
import base64
base64.b64encode("Grüße 👋".encode("utf-8")).decode("ascii")
# 'R3LDvMOfZSDwn5GL'
base64.urlsafe_b64encode("👋".encode()).rstrip(b"=").decode()
# '8J-Riw'
No Linux e no macOS, o comando base64 codifica a entrada padrão:
printf '%s' 'Grüße 👋' | base64
base64 -w 0 file.bin > file.b64
O primeiro comando imprime R3LDvMOfZSDwn5GL. O base64 do GNU no Linux quebra a saída em 76 colunas por padrão, e -w 0 desliga isso; a versão do macOS não quebra a menos que você peça. Mais linguagens e casos especiais: Base64 em JavaScript, Node.js, Python e PHP.
Imagens, PDFs e qualquer outro arquivo passam pelo codificador de arquivos, com saída em data URI e JSON.
Perguntas frequentes
Como codificar uma string em Base64?
Cole a string na caixa de entrada acima e copie o resultado da caixa de saída. No código, converta a string em bytes UTF-8 e codifique esses bytes: base64.b64encode(s.encode()) em Python, Buffer.from(s).toString("base64") em Node.js.
Por que meu Base64 termina com = ou ==?
O Base64 trabalha em blocos de 3 bytes. Quando o tamanho da entrada não é múltiplo de 3, o último bloco fica incompleto e o = marca os bytes que faltam: um = para 2 bytes restantes, == para 1. Os detalhes estão em preenchimento explicado.
Por que o mesmo texto gera outro Base64 em outro lugar?
Quase sempre há uma diferença escondida nos bytes: uma quebra de linha no final (o echo adiciona uma), outro charset (UTF-8, Latin-1 ou UTF-16) ou normalização Unicode. Compare a contagem de bytes da entrada mostrada abaixo da ferramenta.
Codificar em Base64 serve para esconder senhas?
Não. O Base64 não tem chave e qualquer pessoa o decodifica em um segundo. Use-o para transportar dados e use criptografia ou hash de verdade para protegê-los. Veja codificação vs criptografia.
Quanto o texto cresce depois de codificar em Base64?
Cada 3 bytes viram 4 caracteres, então a saída fica cerca de 33% maior, mais as quebras de linha se você quebrar a saída. 100 bytes de UTF-8 viram 136 caracteres.