O = final é preenchimento, não um caractere do texto original. Base64 representa três bytes com quatro caracteres. Um grupo final de um byte precisa de ==; um de dois bytes precisa de = no formato com preenchimento.
Conte bytes, não letras
Cada caractere de dados representa seis bits. Três bytes completam 24 bits e quatro caracteres. Acentos e emojis podem ocupar vários bytes UTF-8: 😀 ocupa quatro bytes e produz 8J+YgA==. A tabela compara entradas de um, dois e três bytes.
Restaurar o preenchimento omitido
Se o formato aceitar entrada sem preenchimento, remova espaços e calcule o comprimento módulo 4. Resto 2: adicione ==; resto 3: adicione =; resto 0: não adicione nada. Resto 1: a sequência está inválida ou truncada e adicionar = não resolve. Confira o formato exigido pela API.
Por que Zg funciona e Zg= falha
O Decodex restaura o preenchimento totalmente omitido de Zg e obtém f. Zg== também é válido. Zg= tem preenchimento parcial e comprimento incorreto, então é rejeitado. A=AA e Zg=== também falham. Não adicione nem remova = repetidamente para esconder um erro de cópia.
Testar este exemplo
| Texto | UTF-8 bytes | Base64 | Preenchimento |
|---|---|---|---|
f | 1 | Zg== | == |
fo | 2 | Zm8= | = |
foo | 3 | Zm9v | — |
Perguntas frequentes
Toda sequência Base64 termina com =?
Não. Quando a quantidade de bytes é múltipla de três, nenhum preenchimento é necessário. Outros protocolos o omitem explicitamente.
Referências
Mais guias de Base64
Base64 e Base64URL: diferenças, preenchimento e exemplos
Compare Base64 e Base64URL, os caracteres + / e - _, preenchimento e decodificação UTF-8 com exemplos verificados.
Base64 em JavaScript com Unicode: corrigir erros de btoa()
Codifique acentos, coreano e emojis com TextEncoder e decodifique com atob e TextDecoder. Código UTF-8 e exemplos verificados.
