QUOTED-PRINTABLE (ENCODE / DECODE)

Signaler
Messages postés
129
Date d'inscription
dimanche 9 décembre 2001
Statut
Membre
Dernière intervention
12 janvier 2009
-
Messages postés
129
Date d'inscription
dimanche 9 décembre 2001
Statut
Membre
Dernière intervention
12 janvier 2009
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/13221-quoted-printable-encode-decode

Messages postés
129
Date d'inscription
dimanche 9 décembre 2001
Statut
Membre
Dernière intervention
12 janvier 2009

Encore une petite modif :
L'utilisation du DEFINE au début génère un Warning, si on appele plusieurs fois la fonction au sein d'un script.

On peut supprimer la ligne (DEFINE) et utiliser directement :

$out .= $newpara . "=\r\n";
Messages postés
129
Date d'inscription
dimanche 9 décembre 2001
Statut
Membre
Dernière intervention
12 janvier 2009

Très pratique lorsque l'on a pas les fonctions imap_8bit dispos sur le serveur.

3 petites modifs tout de même :

l'expression régulière de séparation des lignes, ne prend pas de ?, et il faudrait envisager les encodages unix et mac (\n ou \r) mais ceci n'importe peu dans l'encodage. au pire, on perd les saut de lignes.

$char = '=' . strtoupper ( dechex( $ascii ) );
devient
$char = '=' . strtoupper ( sprintf("%02X", $ascii ) );

pour éviter les soucis d'encodage avec des tabulations et retour à la ligne ( ex code ascii 9 => =09 ) dans l'ancienne version, il ne mettait pas le 0 devant, ce qui générait des problèmes.

et enlever le $char sur la ligne
$out .= $newpara . $char;
ce qui avait pour effet de doubler le dernier caractère de la ligne ...

Nouvelle version complète:

function QPencode($str)
{
DEFINE('CRLF', "\r\n");
$lines = preg_split("/\r\n/", $str);
$out = '';

foreach ($lines as $line)
{
$newpara = '';

for ($j = 0; $j <= strlen($line) - 1; $j++)
{
$char = substr ( $line, $j, 1 );
$ascii = ord ( $char );

if ( $ascii < 32 || $ascii == 61 || $ascii > 126 )
$char = '=' . strtoupper ( sprintf("%02X", $ascii ) );

if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 76 )
{
$out .= $newpara . '=' . CRLF;
$newpara = '';
}
$newpara .= $char;
}
$out .= $newpara;
}
return trim ( $out );
}