¿Qué demonios son todos esos signos igual (=)?
(lars.ingebrigtsen.no)- Últimamente se han viralizado en Twitter citas de correos electrónicos antiguos, lo que despertó la duda de por qué aparecen signos igual (=) al final de las frases
- Ese símbolo aparece por el proceso de codificación “quoted-printable”, donde se usa para indicar que una línea larga fue dividida a la fuerza y que continúa en la siguiente
- Al transmitir correos electrónicos se usa CRLF (carriage return + line feed) como salto de línea, pero al convertirlo al NL de Unix, si el algoritmo de decodificación funciona mal, el signo igual puede quedar visible o perderse caracteres
- El signo igual también se usa para representar caracteres no ASCII (por ejemplo, =C2=A0), y un decodificador defectuoso puede provocar errores al sustituirlo de forma simplista
- La causa del problema es una combinación de lógica de decodificación con bugs y manejo inadecuado de conversiones, lo que muestra que quien procesó esos correos tenía poca pericia técnica
La identidad del signo igual (=) en las citas de correos electrónicos
-
En los últimos días se compartieron en Twitter muchas citas de correos electrónicos antiguos, y llamó la atención la aparición de signos igual al final de las oraciones
- El autor rebate las afirmaciones de quienes lo confundieron con un error de código o de OCR (reconocimiento óptico de caracteres)
- En realidad, se trata de un error de procesamiento de codificación ocurrido al convertir el correo a un formato más legible
-
Antes el correo electrónico era texto simple, pero para manejar líneas largas o caracteres especiales se introdujo la codificación “quoted-printable”
- Al dividir una línea larga, se agrega un signo igual (=) al final para indicar: “esta línea continúa”
- En ese caso, después del signo igual viene un CRLF (carriage return + line feed)
Errores de codificación y decodificación de saltos de línea
-
Los servidores de correo usan CRLF como estándar de salto de línea, mientras que los sistemas Unix usan solo NL
- Durante la conversión se pierde un byte, y si el decodificador lo maneja mal, el signo igual puede quedar visible o pueden desaparecer caracteres
- Por ejemplo, si “non- =CRLF cloven” se procesa mal, puede terminar como “non- loven”, haciendo que desaparezca la “c”
-
Algunas implementaciones procesan un signo igual al final de línea eliminando dos caracteres
- Ese algoritmo falla en archivos con formato Unix y hace que el signo igual quede tal cual
Otro uso del signo igual: codificación de caracteres no ASCII
-
El signo igual también se usa para la codificación de caracteres no ASCII, además de los saltos de línea
- Por ejemplo, “=C2=A0” significa un non-breaking space (espacio de no separación)
- Suele aparecer al representar sangrías o caracteres especiales dentro del cuerpo del correo
-
El autor supone que algunos conversores simplemente hicieron un search-replace de =C2, =A0, etc., sin usar un decodificador adecuado
Contexto técnico y estándar
-
El estándar RFC 2045 define la codificación quoted-printable como algo para transporte (transport)
- Después de recibir el mensaje, lo correcto es decodificarlo y guardarlo como texto limpio
- Sin embargo, en implementaciones reales este proceso a veces se omite, y por eso son frecuentes los errores al procesar saltos de línea
-
En el código de ejemplo,
(quoted-printable-decode-string "he=\nllo")se restaura correctamente como"hello"- Esto ocurre porque se reutilizó un algoritmo que asume CRLF dentro del contexto de un servidor SMTP
- Funciona bien en archivos basados en Windows, pero falla en Unix
Conclusión
- Los signos igual en las citas de correos electrónicos son residuos de la codificación quoted-printable y el resultado de combinar
fallas en el manejo de saltos de línea y en la decodificación de caracteres no ASCII - La raíz del problema es una implementación imprecisa del decodificador y errores en la conversión de codificación
- El autor lo resume como “un problema técnico y el resultado de un procesamiento incorrecto”,
y subraya la necesidad de respetar con cuidado los estándares durante la conversión de correos electrónicos
1 comentarios
Opiniones de Hacker News
El protagonista de este artículo es Lars Ingebrigtsen, quien escribió el manual de Gnus, el paquete lector de correo/Usenet de Emacs
Su manual es ingenioso y útil, y demuestra una comprensión del parseo de correo electrónico mucho más profunda que la de la mayoría de la gente
El manual puede verse aquí, y otra versión está en este enlace
Recuerdo la época en la que empezó a crear Gnus en la Universidad de Oslo (UiO)
Era una pequeña estrella desarrolladora entre los estudiantes de informática, y todos usábamos Emacs y Gnus
Este caso es un ejemplo clásico de alguien que “sabe lo suficiente como para ser peligroso”
Sabía que el correo no es texto plano simple, pero no que el decodificado quoted-printable no puede hacerse con una sustitución sencilla
Es de la misma clase de error que intentar parsear HTML directamente con expresiones regulares: al principio parece funcionar, pero luego termina con un montón de signos ‘=’ en evidencia presentada ante el Congreso
Hubo una pregunta sobre “por qué a los servidores de correo no les gustan las líneas largas”
El servidor debe parsear los encabezados, por lo que no puede tratarse simplemente como un blob binario
IMAP requiere que el servidor haga un parseo completo, y POP3 estaba pensado para un solo dispositivo, así que ya no encaja bien hoy en día
El RFC 821 limitaba la longitud de línea a 1000 bytes, y por compatibilidad era común cortar a menos de 80 caracteres
Por eso la codificación Base64 también inserta saltos de línea cada 76 caracteres
Por ejemplo, un PDP-11 tenía unos 512 KB y un VAX-11 alrededor de 2 MB, y los programadores calculaban la memoria byte por byte
HELO,MAIL FROM,RCPT TO,DATA, etc.Los documentos relacionados pueden verse en la documentación oficial de IBM y en Wikipedia
Al principio pensé que el artículo trataría sobre el significado de operadores como
= == === .=. <== ==> <<== ==>> (==) => =~=Yo personalmente hice software de archivado de correo electrónico
Lo más difícil fue manejar los casos límite de archivos .eml acumulados durante más de 20 años
El concepto es simple, pero el correo electrónico es sorprendentemente complejo
Validar direcciones de correo también es, en la práctica, casi imposible
Tuvo unos pocos usuarios durante varios años, pero el manejo de MIME fue el mayor sufrimiento
Lo que me pareció interesante no fue tanto el signo ‘=’ en sí, sino el fenómeno de que desaparecen los caracteres de alrededor
Parece un error off-by-one: en vez de borrar el ‘=’, desaparece parte del texto real
Tal vez tenga que ver con la conversión CRLF/LF
Me preguntaba por qué este problema aparece justo ahora
En los últimos días la gente ha estado subiendo correos viejos a Twitter, y me preguntaba por qué
Algunas personas plantearon que la causa de este problema quizá no sea Gmail, sino una transformación en un servidor intermedio
Además de la conversión CRLF→LF, si quoted-printable se aplica dos veces también quedan signos ‘=’, así que podrían haber intervenido dos servidores de correo
En la práctica, un pasante sin experiencia reúne los datos con herramientas simples, se convierten varias veces y el formato termina destruido
El original ya fue descartado, y lo único que queda son fragmentos de datos con la forma intacta pero el contenido dañado
El artículo de archive.today también muestra el mismo problema de quoted-printable roto
Los enlaces relacionados son pastes.io/correspond y el hilo de HN
Dijeron que estaría bien tener un visor de .eml que, al ver correos descargados desde Outlook, decodifique quoted-printable automáticamente