PHP Doku:: Convert a 8 bit string to a quoted-printable string - function.quoted-printable-encode.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzTextverarbeitungZeichenkettenString-Funktionenquoted_printable_encode

Ein Service von Reinhard Neidl - Webprogrammierung.

String-Funktionen

<<quoted_printable_decode

quotemeta>>

quoted_printable_encode

(PHP 5 >= 5.3.0)

quoted_printable_encodeConvert a 8 bit string to a quoted-printable string

Beschreibung

string quoted_printable_encode ( string $str )

Returns a quoted printable string created according to » RFC2045, section 6.7.

This function is similar to imap_8bit(), except this one does not require the IMAP module to work.

Parameter-Liste

str

The input string.

Rückgabewerte

Returns the encoded string.

Siehe auch


2 BenutzerBeiträge:
- Beiträge aktualisieren...
Thorsten Glaser
24.09.2010 15:05
Two bugs:

1) your linebreak is wrong

                $linebreak = "\r\n";

2) continuation of lines with no whitespace is broken

                                        /*
                                         * the text after the whitespace will have to
                                         * be read again ( + any additional characters
                                         * that came into existence as a result of the
                                         * encoding process after the whitespace)
                                         *
                                         * Also, do not start at 0, if there was *no*
                                         * whitespace in the whole line
                                         */
                                        if (($i + $addtl_chars) > $whitesp_diff) { 
                                                $output .= substr($cur_conv_line, 0,
                                                    (strlen($cur_conv_line) - $whitesp_diff)) .
                                                    $linebreak;
                                                $i = $i - $whitesp_diff + $addtl_chars;
                                        } else {
                                                /* emit continuation --mirabilos */
                                                $output .= $cur_conv_line .
                                                    '=' . $linebreak;
                                        }
tzangerl [dot] pdc {dot} kth dot se
9.04.2010 11:05
A function that QP-encodes an input string (written for PHP < 5.3) and
wordwraps it at the same time, in order to avoid classification according to the MIME QP LONG LINE rule of SpamAssassin.  Thanks for Matt Jeffers to point out errors in the below quoted_printable script!

<?php
function quoted_printable_encode($input, $line_max = 75) {
  
$hex = array('0','1','2','3','4','5','6','7',
                         
'8','9','A','B','C','D','E','F');
  
$lines = preg_split("/(?:\r\n|\r|\n)/", $input);
  
$linebreak = "=0D=0A=\r\n";
  
/* the linebreak also counts as characters in the mime_qp_long_line
    * rule of spam-assassin */
  
$line_max = $line_max - strlen($linebreak);
  
$escape = "=";
  
$output = "";
  
$cur_conv_line = "";
  
$length = 0;
  
$whitespace_pos = 0;
  
$addtl_chars = 0;

  
// iterate lines
  
for ($j=0; $j<count($lines); $j++) {
    
$line = $lines[$j];
    
$linlen = strlen($line);

    
// iterate chars
    
for ($i = 0; $i < $linlen; $i++) {
      
$c = substr($line, $i, 1);
      
$dec = ord($c);

      
$length++;

       if (
$dec == 32) {
         
// space occurring at end of line, need to encode
         
if (($i == ($linlen - 1))) {
            
$c = "=20";
            
$length += 2;
          }

         
$addtl_chars = 0;
         
$whitespace_pos = $i;
       } elseif ( (
$dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
         
$h2 = floor($dec/16); $h1 = floor($dec%16);
         
$c = $escape . $hex["$h2"] . $hex["$h1"];
         
$length += 2;
         
$addtl_chars += 2;
       }

      
// length for wordwrap exceeded, get a newline into the text
      
if ($length >= $line_max) {
        
$cur_conv_line .= $c;

        
// read only up to the whitespace for the current line
        
$whitesp_diff = $i - $whitespace_pos + $addtl_chars;

       
/* the text after the whitespace will have to be read
         * again ( + any additional characters that came into
         * existence as a result of the encoding process after the whitespace)
         *
         * Also, do not start at 0, if there was *no* whitespace in
         * the whole line */
        
if (($i + $addtl_chars) > $whitesp_diff) {
           
$output .= substr($cur_conv_line, 0, (strlen($cur_conv_line) -
                          
$whitesp_diff)) . $linebreak;
           
$i $i - $whitesp_diff + $addtl_chars;
          } else {
           
$output .= $cur_conv_line . $linebreak;
          }

       
$cur_conv_line = "";
       
$length = 0;
       
$whitespace_pos = 0;
      } else {
       
// length for wordwrap not reached, continue reading
       
$cur_conv_line .= $c;
      }
    }
// end of for

   
$length = 0;
   
$whitespace_pos = 0;
   
$output .= $cur_conv_line;
   
$cur_conv_line = "";

    if (
$j<=count($lines)-1) {
     
$output .= $linebreak;
    }
  }
// end for

 
return trim($output);
}
// end quoted_printable_encode
?>



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)