QUOTED-PRINTABLE (ENCODE / DECODE)

MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009 - 14 déc. 2007 à 12:28
MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009 - 14 déc. 2007 à 14:21
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

MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009
14 déc. 2007 à 14:21
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";
MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009
14 déc. 2007 à 12:28
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 );
}
Rejoignez-nous