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): stringElle prend un seul argument et retourne la chaîne décodée.
| Paramètre | Type | Description |
|---|---|---|
$string | string | La 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
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=A8vous 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 avecmb_decode_mimeheader()ouiconv_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
quoted_printable_encode()— la fonction d'encodage correspondante.mail()— envoi d'emails depuis PHP.utf8_encode()— convertir du texte ISO-8859-1 en UTF-8.- PHP Strings — vue d'ensemble de la gestion des chaînes en PHP.