Como codificar texto UTF-8 em Base64
- Digite ou cole o texto em Entrada · texto. O Charset já está em UTF-8.
- O Base64 aparece em Saída · Base64. O número Entrada abaixo da ferramenta é a quantidade de bytes UTF-8; o contador acima da caixa conta caracteres do jeito que o JavaScript conta, então um emoji vale 2.
- Marque URL-safe (- _) e Sem preenchimento (=) para URLs e tokens, ou escolha uma Quebra de linha para e-mail ou PEM.
- Copie a saída ou baixe-a como
base64.txt.
Base64 para UTF-8 transforma o resultado de volta em texto.
Como o UTF-8 transforma caracteres em bytes
O UTF-8 usa de 1 a 4 bytes por code point. O ASCII continua com 1 byte, e é por isso que texto em inglês fica igual em UTF-8 e em ASCII. Todo o resto ocupa mais:
| Caractere | Code point | Bytes UTF-8 | Base64 |
|---|---|---|---|
A | U+0041 | 41 | QQ== |
é | U+00E9 | C3 A9 | w6k= |
€ | U+20AC | E2 82 AC | 4oKs |
日本語 | U+65E5 U+672C U+8A9E | 9 bytes, 3 cada | 5pel5pys6Kqe |
😀 | U+1F600 | F0 9F 98 80 | 8J+YgA== |
Como o Base64 soma um terço aos bytes, uma frase em chinês ou japonês cresce cerca de quatro vezes, de caracteres para caracteres Base64, e um emoji sozinho vira 8 caracteres. Lembre disso em campos com limite de comprimento; a calculadora de tamanho ajuda.
Sequências de emojis e tons de pele
O que parece um emoji costuma ser vários code points colados. Um tom de pele é um modificador separado, e emojis de família ou de profissão unem várias pessoas com um zero-width joiner invisível (U+200D):
| Emoji | Code points | Bytes UTF-8 | Base64 |
|---|---|---|---|
| 😀 | 1 | 4 | 8J+YgA== |
| 👍🏽 | 2 (polegar para cima + tom de pele médio) | 8 | 8J+RjfCfj70= |
| 👨👩👧 | 5 (três pessoas + dois joiners) | 18 | 8J+RqOKAjfCfkanigI3wn5Gn |
Cortar uma string Base64 ou os bytes decodificados no meio de uma sequência dessas deixa caracteres quebrados, então nunca trunque UTF-8 codificado em um byte qualquer.
Mesmo texto, bytes diferentes: normalização Unicode
Alguns caracteres têm duas grafias válidas no Unicode. é pode ser o code point único U+00E9 (composto, NFC) ou e seguido de U+0301 COMBINING ACUTE ACCENT (decomposto, NFD). Os dois aparecem iguais na tela, mas os bytes são diferentes:
| Texto | Forma | Bytes | Base64 |
|---|---|---|---|
é | NFC | C3 A9 | w6k= |
é | NFD | 65 CC 81 | ZcyB |
naïve | NFC | 6 | bmHDr3Zl |
naïve | NFD | 7 | bmFpzIh2ZQ== |
Nomes de arquivos no antigo sistema de arquivos HFS+ da Apple são guardados na forma decomposta, enquanto a maioria dos teclados gera texto composto. Se você compara valores Base64, assina esses valores ou os usa como chaves, normalize antes. Esta ferramenta codifica exatamente os code points que você cola e não normaliza.
UTF-8 para Base64 no código
Em JavaScript, o TextEncoder sempre gera UTF-8. Normalize antes quando a entrada puder vir de fontes diferentes:
const text = "e\u0301".normalize("NFC");
Buffer.from(text, "utf8").toString("base64"); // "w6k=" (Node.js)
new TextEncoder().encode(text); // Uint8Array [195, 169]
Nos navegadores, os bytes do TextEncoder podem ir para bytes.toBase64() onde houver suporte (Uint8Array.toBase64), ou passar pelo helper com btoa da página de JavaScript.
import base64, unicodedata
s = unicodedata.normalize("NFC", "nai\u0308ve")
base64.b64encode(s.encode("utf-8")).decode() # 'bmHDr3Zl'
Veja Base64 em Python para arquivos e streaming.
Perguntas frequentes
Base64 de UTF-8 é a mesma coisa que Base64 normal?
Sim. O Base64 sempre codifica bytes; “UTF-8 para Base64” só diz quais bytes. Para texto ASCII simples, os bytes UTF-8 são iguais aos bytes ASCII, então a saída é idêntica nos dois casos.
Por que duas strings que parecem idênticas geram Base64 diferente?
O Unicode permite escrever alguns caracteres de mais de uma forma. é como um único code point é w6k=, enquanto e mais um acento combinante é ZcyB. Normalize para NFC antes de codificar se os valores precisarem bater.
O codificador adiciona um byte order mark de UTF-8?
Não. A saída começa direto com os bytes do seu texto. Se um consumidor exigir um BOM, o Base64 precisa começar com 77u/, que é a codificação dos bytes EF BB BF.
Quantos bytes ocupa um emoji?
Um único code point de emoji ocupa 4 bytes em UTF-8. Emojis com tom de pele ou famílias unidas são vários code points: 👍🏽 tem 8 bytes e a família 👨👩👧 tem 18.