Quoted-printable (encode / decode)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 028 fois - Téléchargée 28 fois

Contenu du snippet

Pour encoder ou décoder facilement un texte en 'quoted-printable' (format fréquemment utilisé dans le corp des mail ou posts de newsgroup) , il faut avoir la librairie imap d'installé, ...

voilà deux fonctions qui permettent d'obtenir le même resultat ( conforme au RFC 2045 - http://rfc.net/rfc2045.html )

Source / Exemple :


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 ( dechex( $ascii ) );
            }
            
            if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 76 ) 
            {
            	$out .= $newpara . '=' . CRLF;   $newpara = '';
            }
            $newpara .= $char;
        }
        $out .= $newpara . $char;
    }
    return trim ( $out );	
}

function QPdecode( $str )
{
    $out = preg_replace('/=\r?\n/', '', $str);
    $out = preg_replace('/=([A-F0-9]{2})/e', chr( hexdec ('\\1' ) ), $out);
    
    return trim($out);
}

?>

Conclusion :


utilisation :

QPencode('texte');
QPdecode('texte');

voilou, en espérant que ce code va vous servir ;)

A voir également

Ajouter un commentaire

Commentaires

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 );
}

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.