Cómo decodificar quoted-printable
- Haz clic en Quoted-printable → Texto encima de la herramienta para cambiar a decodificación.
- Pega el texto codificado en la entrada, por ejemplo una parte del cuerpo copiada del código fuente de un email.
- Lee el texto en la salida. Si las letras con tilde se ven mal, ajusta Juego de caracteres bajo la salida al que indica el encabezado
Content-Typede esa parte, por ejemplocharset=iso-8859-1. - Usa Copiar salida o Descargar. Los saltos de línea suaves se unen y cada
=XXvuelve a ser su byte.
Para codificar, deja la dirección en Texto → Quoted-printable y escribe o pega el texto. El Juego de caracteres bajo la entrada decide en qué bytes se convierten los caracteres que no son ASCII.
Cómo funciona quoted-printable
Quoted-printable (RFC 2045, sección 6.7) mantiene el texto legible siempre que puede y solo escapa lo imprescindible:
- Los caracteres ASCII imprimibles se quedan como están, salvo
=. - Cualquier otro byte se escribe como
=seguido de dos dígitos hexadecimales en mayúsculas. En UTF-8 eso significa que cada carácter no ASCII se convierte en dos a cuatro escapes. - El propio
=pasa a ser=3D. - Un espacio o un tabulador al final de una línea pasa a ser
=20o=09. - Las líneas tienen como máximo 76 caracteres. Las más largas se dividen con un salto de línea suave: un
=al final de la línea, que el decodificador elimina.
| 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é |
En la última fila, =E9 es un solo byte: é en ISO-8859-1 y Windows-1252, y no válido por sí solo en UTF-8, así que el resultado depende del juego de caracteres con el que decodifiques.
Modo texto y modo binario
Por defecto, el codificador trata la entrada como texto. Los saltos de línea siguen siendo saltos de línea reales y, como en binascii.b2a_qp de Python, si la primera línea termina en CRLF, un LF suelto más adelante también se convierte en CRLF. Es lo correcto para el texto de un email, pero cambia los bytes.
Marca Codificar saltos de línea (binario) cuando importen los bytes exactos. Entonces los saltos de línea se escriben como =0D y =0A, de modo que Hello, CRLF, World se convierte en Hello=0D=0AWorld, y al decodificar recuperas exactamente lo que entró. Para datos binarios de verdad, como imágenes, Base64 es mejor opción de todos modos.
Quoted-printable o Base64 en el email
Los programas de correo eligen el Content-Transfer-Encoding para cada parte MIME. Quoted-printable conviene para texto que es casi todo ASCII, porque sigue siendo legible y crece poco. Base64 tiene una sobrecarga fija de alrededor del 33 % y sale ganando en cuanto la mayoría de los bytes necesitan escape:
| Texto | Bytes UTF-8 | Quoted-printable | Base64 |
|---|---|---|---|
Grüße aus München | 20 | 32 caracteres | 28 caracteres |
Привет, мир (ruso) | 20 | 56 caracteres | 28 caracteres |
Incluso un texto alemán con tres letras no ASCII en 17 caracteres ya ocupa más en quoted-printable que en Base64; el cirílico duplica el tamaño de Base64. Para obtener la forma Base64 con las líneas de 76 caracteres que exige el email, usa el codificador Base64 MIME. Base64 en el email explica cómo aparecen ambas codificaciones en un mensaje, incluidos los adjuntos y los encabezados codificados.
Leer un email completo
Copiar una sola parte del cuerpo de un mensaje en bruto sirve para un vistazo rápido. Para un archivo .eml completo, el decodificador EML analiza los encabezados, decodifica las partes quoted-printable y Base64 con sus juegos de caracteres declarados y lista los adjuntos para descargarlos. Quoted-printable también aparece fuera del email, por ejemplo en archivos vCard 2.1 con ENCODING=QUOTED-PRINTABLE; pega aquí el valor que va después de los dos puntos.
Quoted-printable en 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€'
El paquete email de Python aplica la decodificación correcta automáticamente: msg.get_payload(decode=True) devuelve los bytes decodificados de una parte, sea cual sea su codificación de transferencia. La página de Python cubre la parte de Base64.
Preguntas frecuentes
¿Qué significa =3D en un email?
Es un signo igual codificado. En quoted-printable = inicia un escape, así que un = literal se escribe como =3D, su valor de byte en hexadecimal. Aparece mucho en los emails HTML, como en style=3D"color:red".
¿Por qué las líneas del código fuente de un email terminan en =?
Es un salto de línea suave. Las líneas quoted-printable pueden tener como máximo 76 caracteres, así que las más largas se dividen y cada corte se marca con un = final. El decodificador vuelve a unir los trozos en una sola línea.
¿Qué significa =20 al final de una línea?
Un espacio codificado. Los sistemas de correo pueden eliminar los espacios finales, así que quoted-printable protege un espacio o un tabulador al final de la línea escribiéndolo como =20 o =09.
¿Cómo decodifico quoted-printable en Python?
quopri.decodestring(data) o binascii.a2b_qp(data) devuelven bytes; llama a .decode("utf-8") o al juego de caracteres que indique el encabezado Content-Type.
¿Puede decodificar asuntos del tipo =?UTF-8?Q?...?=?
En esta página no. Son palabras codificadas según RFC 2047, que usan una codificación Q parecida con _ para los espacios. El decodificador EML las decodifica en los encabezados, junto con los cuerpos quoted-printable.