字符串函数
在线手册:中文  英文

quoted_printable_encode

(PHP 5 >= 5.3.0)

quoted_printable_encodeConvert a 8 bit string to a quoted-printable string

说明

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.

参数

str

The input string.

返回值

Returns the encoded string.

参见


字符串函数
在线手册:中文  英文

用户评论:

ericth at NOSPAM dot pennyworth dot com (2011-10-07 13:46:14)

I have re-written the PHP 5.3.8 function for quoted_printable_encode into PHP for use with PHP < 5.3.  Tested with PHP 5.2.11.

<?php
define
('PHP_QPRINT_MAXL'75);

function 
php_quot_print_encode($str)
{
    
$lp 0;
    
$ret '';
    
$hex "0123456789ABCDEF";
    
$length strlen($str);
    
$str_index 0;
    
    while (
$length--) {
        if (((
$c $str[$str_index++]) == "\015") && ($str[$str_index] == "\012") && $length 0) {
            
$ret .= "\015";
            
$ret .= $str[$str_index++];
            
$length--;
            
$lp 0;
        } else {
            if (
ctype_cntrl($c
                || (
ord($c) == 0x7f
                || (
ord($c) & 0x80
                || (
$c == '='
                || ((
$c == ' ') && ($str[$str_index] == "\015")))
            {
                if ((
$lp += 3) > PHP_QPRINT_MAXL)
                {
                    
$ret .= '=';
                    
$ret .= "\015";
                    
$ret .= "\012";
                    
$lp 3;
                }
                
$ret .= '=';
                
$ret .= $hex[ord($c) >> 4];
                
$ret .= $hex[ord($c) & 0xf];
            } 
            else 
            {
                if ((++
$lp) > PHP_QPRINT_MAXL
                {
                    
$ret .= '=';
                    
$ret .= "\015";
                    
$ret .= "\012";
                    
$lp 1;
                }
                
$ret .= $c;
            }
        }
    }

    return 
$ret;
}

?>

arnaudv6 (2011-08-15 08:56:21)

One will like to know and clearly read that RFC2045 specifies a line shall not exceed 75 characters.
Accordingly, quoted_printable_encode() splits line at this limit.

senacle (2011-01-28 06:24:02)

If you need to encode the subject of your mail message, use as follow :

<?php
quoted_printable_encode
($subject58"subject");

    function 
quoted_printable_encode($input$line_max 75$subject) {
        
/**    The Quoted Printable encodes only with 75 characters per ligne.
        *    For encoding the subject of message, we must split the subject every 58 characters,
        *    because of adding =?iso-8859-1?Q? at the beginning and ?= at the end of each split.

            *    @param    string        $input            string to encode
            *    @param    int        $line_max            max number of char per ligne
            *    @param    string        $subject            specify if we encode a subject or any other string

            *    @access    public
            */
        
$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 "\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$i1);
                
$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;
                } else if ( (
$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) {
                        if (
$subject == "subject") {
                            
$output .= "=?ISO-8859-1?Q?".substr($cur_conv_line0
                                    (
strlen($cur_conv_line) - $whitesp_diff))."?=";
                        } else {
                            
$output .= substr($cur_conv_line0,
                                    (
strlen($cur_conv_line) - $whitesp_diff)).$linebreak;
                        }
                        
$i $i $whitesp_diff $addtl_chars;
                    } else {
                    
/* emit continuation --mirabilos */
                        
if ($subject == "subject") {
                            
$output .= "=?ISO-8859-1?Q?".$cur_conv_line."?=";
                        } 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;
            if (
$subject == "subject") {
                
$output .= "=?ISO-8859-1?Q?".$cur_conv_line."?=";
            } else {
                
$output .= $cur_conv_line;
                if (
$j<=count($lines)-1) {
                    
$output .= $linebreak;
                }
            }
            
$cur_conv_line "";

            } 
// end for

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

Thorsten Glaser (2010-09-24 06:05:29)

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 (2010-04-09 02:05:20)

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$i1);
       
$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_line0, (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
?>

易百教程