Comment décoder du quoted-printable
- Cliquez sur Quoted-printable → Texte au-dessus de l’outil pour passer en décodage.
- Collez le texte encodé dans l’entrée, par exemple une partie du corps copiée depuis la source d’un e-mail.
- Lisez le texte dans la sortie. Si les lettres accentuées s’affichent mal, réglez Jeu de caractères sous la sortie sur le jeu indiqué dans l’en-tête
Content-Typede la partie, par exemplecharset=iso-8859-1. - Utilisez Copier la sortie ou Télécharger. Les sauts de ligne souples sont recollés et chaque
=XXredevient son octet.
Pour encoder, laissez le sens sur Texte → Quoted-printable et saisissez ou collez le texte. Le Jeu de caractères sous l’entrée détermine les octets produits pour les caractères non ASCII.
Comment fonctionne le quoted-printable
Le quoted-printable (RFC 2045, section 6.7) garde le texte lisible autant que possible et n’échappe que le strict nécessaire :
- Les caractères ASCII imprimables restent tels quels, sauf
=. - Tout autre octet s’écrit
=suivi de deux chiffres hex en majuscules. En UTF-8, chaque caractère non ASCII devient donc deux à quatre échappements. =lui-même devient=3D.- Une espace ou une tabulation en fin de ligne devient
=20ou=09. - Les lignes font au plus 76 caractères. Les plus longues sont coupées par un saut de ligne souple : un
=en fin de ligne, que le décodeur supprime.
| Texte | 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 décodé en ISO-8859-1 | Café |
Dans la dernière ligne, =E9 est un seul octet : é en ISO-8859-1 et en Windows-1252, mais un octet non valide à lui seul en UTF-8. Le résultat dépend donc du jeu de caractères choisi pour le décodage.
Mode texte et mode binaire
Par défaut, l’encodeur traite l’entrée comme du texte. Les sauts de ligne restent de vrais sauts de ligne et, comme avec binascii.b2a_qp en Python, si la première ligne se termine par CRLF, un LF isolé plus loin devient lui aussi CRLF. C’est le bon comportement pour du texte d’e-mail, mais cela modifie les octets.
Cochez Encoder les sauts de ligne (binaire) quand les octets exacts comptent. Les sauts de ligne s’écrivent alors =0D et =0A : Hello, CRLF, World devient Hello=0D=0AWorld, et le décodage rend exactement ce qui est entré. Pour de vraies données binaires comme des images, Base64 reste de toute façon le meilleur choix.
Quoted-printable ou Base64 dans les e-mails
Le logiciel de messagerie choisit le Content-Transfer-Encoding pour chaque partie MIME. Le quoted-printable convient au texte surtout ASCII, car il reste lisible et grossit peu. Base64 a un surcoût fixe d’environ 33 % et l’emporte dès que la plupart des octets doivent être échappés :
| Texte | Octets UTF-8 | Quoted-printable | Base64 |
|---|---|---|---|
Grüße aus München | 20 | 32 caractères | 28 caractères |
Привет, мир (russe) | 20 | 56 caractères | 28 caractères |
Même un texte allemand avec trois lettres non ASCII sur 17 caractères est déjà plus long en quoted-printable qu’en Base64 ; le cyrillique fait le double de la taille Base64. Pour produire la forme Base64 avec les lignes de 76 caractères qu’exige l’e-mail, utilisez l’encodeur Base64 MIME. Base64 dans les e-mails explique comment les deux encodages apparaissent dans un message, pièces jointes et en-têtes encodés compris.
Lire un e-mail complet
Copier une partie du corps depuis un message brut suffit pour un coup d’œil rapide. Pour un fichier .eml complet, le décodeur EML analyse les en-têtes, décode les parties quoted-printable et Base64 avec leurs jeux de caractères déclarés, et liste les pièces jointes à télécharger. Le quoted-printable existe aussi en dehors des e-mails, par exemple dans les fichiers vCard 2.1 avec ENCODING=QUOTED-PRINTABLE ; collez ici la valeur qui suit les deux-points.
Le quoted-printable dans le code
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€'
Le paquet email de Python applique automatiquement le bon décodage : msg.get_payload(decode=True) renvoie les octets décodés d’une partie, quel que soit son encodage de transfert. La page Python couvre le côté Base64.
FAQ
Que signifie =3D dans un e-mail ?
C’est un signe égal encodé. En quoted-printable, = ouvre un échappement : un = littéral doit donc s’écrire =3D, la valeur de son octet en hex. On le croise souvent dans les e-mails HTML, par exemple style=3D"color:red".
Pourquoi les lignes de la source d'un e-mail se terminent-elles par = ?
C’est un saut de ligne souple. Une ligne quoted-printable fait au plus 76 caractères : les lignes plus longues sont coupées et chaque coupure est marquée par un = final. Le décodeur recolle les morceaux en une seule ligne.
Que signifie =20 en fin de ligne ?
Une espace encodée. Les systèmes de messagerie peuvent supprimer les espaces en fin de ligne ; le quoted-printable protège donc une espace ou une tabulation finale en l’écrivant =20 ou =09.
Comment décoder du quoted-printable en Python ?
quopri.decodestring(data) ou binascii.a2b_qp(data) renvoient des octets ; appelez ensuite .decode("utf-8") ou le jeu de caractères indiqué dans l’en-tête Content-Type.
Peut-il décoder les objets de la forme =?UTF-8?Q?...?= ?
Pas sur cette page. Ce sont des encoded words RFC 2047, qui utilisent un encodage Q apparenté avec _ pour les espaces. Le décodeur EML les décode dans les en-têtes, en plus des corps en quoted-printable.