Como decodificar quoted-printable
- Clique em Quoted-printable → Texto acima da ferramenta para mudar para decodificação.
- Cole o texto codificado na entrada, por exemplo uma parte do corpo copiada do código-fonte de um e-mail.
- Leia o texto na saída. Se as letras acentuadas aparecerem erradas, ajuste o Charset abaixo da saída para o charset indicado no cabeçalho
Content-Typeda parte, comocharset=iso-8859-1. - Use Copiar saída ou Baixar. As quebras de linha suaves são unidas e cada
=XXvolta a ser o seu byte.
Para codificar, deixe a direção em Texto → Quoted-printable e digite ou cole o texto. O Charset abaixo da entrada define em quais bytes os caracteres não ASCII se transformam.
Como o quoted-printable funciona
O quoted-printable (RFC 2045, seção 6.7) mantém o texto legível onde dá e só escapa o que for necessário:
- Caracteres ASCII imprimíveis ficam como estão, exceto o
=. - Qualquer outro byte é escrito como
=mais dois dígitos hex em maiúsculas. Em UTF-8, isso significa que cada caractere não ASCII vira de dois a quatro escapes. - O próprio
=vira=3D. - Um espaço ou tab no fim da linha vira
=20ou=09. - As linhas têm no máximo 76 caracteres. As mais longas são divididas com uma quebra de linha suave: um
=no fim da linha, que o decodificador remove.
| Texto | Quoted-printable |
|---|---|
café | caf=C3=A9 |
Grüße aus München | Gr=C3=BC=C3=9Fe aus M=C3=BCnchen |
100% = €5 | 100% =3D =E2=82=AC5 |
<p style="color:red">Hi</p> | <p style=3D"color:red">Hi</p> |
Caf=E9 decodificado como ISO-8859-1 | Café |
Na última linha, =E9 é um único byte: é em ISO-8859-1 e Windows-1252 e, sozinho, inválido em UTF-8, então o resultado depende do charset usado na decodificação.
Modo texto e modo binário
Por padrão, o codificador trata a entrada como texto. Quebras de linha continuam sendo quebras de linha reais e, como no binascii.b2a_qp do Python, se a primeira linha terminar em CRLF, um LF solto mais adiante também vira CRLF. Isso é o certo para texto de e-mail, mas altera os bytes.
Marque Codificar quebras de linha (binário) quando os bytes exatos importarem. As quebras de linha passam a ser escritas como =0D e =0A, então Hello, CRLF, World vira Hello=0D=0AWorld, e a decodificação devolve exatamente o que entrou. Para dados realmente binários, como imagens, Base64 é a melhor escolha de qualquer forma.
Quoted-printable ou Base64 no e-mail
O programa de e-mail escolhe o Content-Transfer-Encoding para cada parte MIME. O quoted-printable serve para texto majoritariamente ASCII, porque continua legível e cresce pouco. O Base64 tem um acréscimo fixo de cerca de 33% e ganha quando a maioria dos bytes precisa de escape:
| Texto | Bytes em UTF-8 | Quoted-printable | Base64 |
|---|---|---|---|
Grüße aus München | 20 | 32 caracteres | 28 caracteres |
Привет, мир (russo) | 20 | 56 caracteres | 28 caracteres |
Mesmo um texto em alemão com três letras não ASCII em 17 caracteres já fica maior em quoted-printable do que em Base64; em cirílico, chega ao dobro do tamanho do Base64. Para gerar a forma Base64 com as linhas de 76 caracteres que o e-mail exige, use o codificador Base64 MIME. Base64 no e-mail explica como as duas codificações aparecem em uma mensagem, incluindo anexos e cabeçalhos codificados.
Lendo um e-mail inteiro
Copiar uma parte do corpo de uma mensagem bruta funciona para uma olhada rápida. Para um arquivo .eml completo, o decodificador de EML interpreta os cabeçalhos, decodifica as partes em quoted-printable e Base64 com os charsets declarados e lista os anexos para download. O quoted-printable também aparece fora do e-mail, por exemplo em arquivos vCard 2.1 com ENCODING=QUOTED-PRINTABLE; cole aqui o valor que vem depois dos dois-pontos.
Quoted-printable no código
import quopri
quopri.encodestring("café".encode("utf-8")) # b'caf=C3=A9'
quopri.decodestring(b"caf=C3=A9 =3D 5=E2=82=AC").decode("utf-8") # 'café = 5€'
O pacote email do Python aplica a decodificação certa automaticamente: msg.get_payload(decode=True) retorna os bytes decodificados de uma parte, seja qual for a codificação de transferência. A página de Python cobre o lado do Base64.
Perguntas frequentes
O que significa =3D em um e-mail?
É um sinal de igual codificado. No quoted-printable o = inicia um escape, então um = literal precisa ser escrito como =3D, o valor do byte em hex. Isso aparece muito em e-mails HTML, como em style=3D"color:red".
Por que as linhas no código-fonte do e-mail terminam com =?
É uma quebra de linha suave. Linhas quoted-printable podem ter no máximo 76 caracteres, então as mais longas são divididas e cada quebra é marcada com um = no final. O decodificador junta os pedaços de novo em uma linha só.
O que significa =20 no fim de uma linha?
Um espaço codificado. Servidores de e-mail podem remover espaços no fim da linha, por isso o quoted-printable protege um espaço ou tab no final escrevendo =20 ou =09.
Como decodificar quoted-printable em Python?
quopri.decodestring(data) ou binascii.a2b_qp(data) retornam bytes; depois chame .decode("utf-8") ou o charset indicado no cabeçalho Content-Type.
Dá para decodificar assuntos no formato =?UTF-8?Q?...?=?
Não nesta página. Esses são encoded words do RFC 2047, que usam uma codificação Q parecida, com _ no lugar do espaço. O decodificador de EML decodifica esses cabeçalhos, junto com corpos em quoted-printable.