W3docs

quoted_printable_decode()

Article sur la fonction PHP quoted_printable_decode(), utilisée pour décoder une chaîne quoted-printable, utile pour le traitement des emails.

La fonction PHP quoted_printable_decode() convertit une chaîne quoted-printable en sa forme originale sur 8 bits. Le quoted-printable est un encodage défini par MIME (RFC 2045) qui permet aux textes contenant des octets non-ASCII de circuler en toute sécurité à travers des systèmes — principalement les emails — conçus pour ne gérer que les caractères ASCII 7 bits. Cette page explique à quoi ressemble cet encodage, quand vous avez réellement besoin de le décoder, et les pièges à éviter.

Qu'est-ce que le quoted-printable ?

Dans l'encodage quoted-printable, tout octet qui n'est pas un caractère ASCII imprimable « sûr » est écrit sous la forme d'un signe égal suivi de sa valeur hexadécimale à deux chiffres. Par exemple, un espace peut apparaître sous la forme =20 et la lettre accentuée è (séquence d'octets UTF-8 C3 A8) devient =C3=A8. Un = seul en fin de ligne est un saut de ligne doux utilisé pour maintenir les lignes encodées sous 76 caractères ; il est supprimé lors du décodage.

Vous rencontrerez le plus souvent cet encodage dans le corps et les en-têtes des messages email, où l'en-tête Content-Transfer-Encoding: quoted-printable indique au client comment le texte a été stocké.

Syntaxe

quoted_printable_decode(string $string): string

Elle prend un seul argument et retourne la chaîne décodée.

ParamètreTypeDescription
$stringstringLa chaîne quoted-printable à décoder.

Valeur de retour : la chaîne décodée sur 8 bits. Les séquences qui ne constituent pas un quoted-printable valide sont retournées inchangées plutôt que de lever une erreur.

Exemple de base

php— editable, runs on the server

Ici, =20 est le code hexadécimal d'un espace (ASCII 32), donc la sortie est :

Hello World!

Décodage de texte accentué et de sauts de ligne doux

La fonction excelle sur du contenu réel qui mélange des caractères multioctets encodés avec les sauts de ligne doux (= en fin de ligne) utilisés pour découper les longues lignes :

<?php
$encoded = "J=27interpr=C3=A8te=20du=20fran=C3=A7ais,=\n et c=27est tout.";
echo quoted_printable_decode($encoded);
?>

Sortie :

J'interprète du français, et c'est tout.

Remarquez deux choses : chaque paire =XX (comme =C3=A8 pour è) est retransformée en son octet brut, et le = de fin suivi d'un saut de ligne est entièrement supprimé, rejoignant les deux lignes en une seule.

Quand l'utiliser ?

Utilisez quoted_printable_decode() lorsque vous lisez des emails bruts — par exemple en analysant un message récupéré depuis une boîte aux lettres IMAP dont la partie est marquée Content-Transfer-Encoding: quoted-printable. C'est l'inverse de quoted_printable_encode(), que vous appelez avant d'envoyer ce type de contenu.

Quelques points à garder à l'esprit :

  • Elle ne modifie pas le jeu de caractères. Décoder =C3=A8 vous donne les octets UTF-8 bruts pour è ; le résultat n'est correct que si vous traitez la sortie comme de l'UTF-8. La fonction ne sait rien des encodages — elle inverse simplement l'échappement hexadécimal.
  • Les en-têtes encoded-word sont différents. Les lignes de sujet comme =?UTF-8?Q?...?= utilisent un format similaire mais distinct ; décodez-les avec mb_decode_mimeheader() ou iconv_mime_decode() à la place.
  • Les entrées invalides sont tolérées. Un = isolé non suivi d'un hexadécimal valide est laissé tel quel, donc des données malformées ne provoqueront pas d'erreur.

Fonctions connexes

Pratique

Pratique
Que fait la fonction quoted_printable_decode() en PHP ?
Que fait la fonction quoted_printable_decode() en PHP ?
Was this page helpful?