|
 |
quoted_printable_decode (PHP 3 >= 3.0.6, PHP 4, PHP 5) quoted_printable_decode --
Раскодирует строку, закодированную методом quoted printable
Описаниеstring quoted_printable_decode ( string str )
Возращает строку, полученную декодированием
str методом quoted printable.
Эта функция подобна функции imap_qprint(), но не
требует для своей работы модуля IMAP.
quoted_printable_decode
steffen dot weber at computerbase dot de
22-Jul-2005 02:08
As the two digit hexadecimal representation SHOULD be in uppercase you want to use "=%02X" (uppercase X) instead of "=%02x" as the first argument to sprintf().
bendi at interia dot pl
29-Mar-2005 01:08
This function appeared twice already and in both versions it's got error in rule replacing chunk_split, because it misses the last line in encoded text if it's shorter than 73 characters.
My solution (got rid of replace_callback)
<?
function quoted_printable_encode( $sString ) {
$sString = preg_replace( '/[^\x21-\x3C\x3E-\x7E\x09\x20]/e', 'sprintf( "=%02x", ord ( "$0" ) ) ;', $sString );
preg_match_all( '/.{1,73}([^=]{0,3})?/', $sString, $aMatch );
return implode( '=' . CR, $aMatch[0] );
}
?>
dmitry at koterov dot ru
19-Feb-2005 05:26
Previous comment has a bug: encoding of short test does not work because of incorrect usage of preg_match_all(). Have somebody read it at all? :-)
Correct version (seems), with additional imap_8bit() function emulation:
if (!function_exists('imap_8bit')) {
function imap_8bit($text) {
return quoted_printable_encode($text);
}
}
function quoted_printable_encode_character ( $matches ) {
$character = $matches[0];
return sprintf ( '=%02x', ord ( $character ) );
}
// based on http://www.freesoft.org/CIE/RFC/1521/6.htm
function quoted_printable_encode ( $string ) {
// rule #2, #3 (leaves space and tab characters in tact)
$string = preg_replace_callback (
'/[^\x21-\x3C\x3E-\x7E\x09\x20]/',
'quoted_printable_encode_character',
$string
);
$newline = "=\r\n"; // '=' + CRLF (rule #4)
// make sure the splitting of lines does not interfere with escaped characters
// (chunk_split fails here)
$string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string);
return $string;
}
drm at melp dot nl
09-Feb-2005 03:32
A easier, improved way of encoding for quoted-printable transfer:
------
function quoted_printable_encode_character ( $matches ) {
$character = end ( $matches );
return sprintf ( '=%02x', ord ( $character ) );
}
// based on http://www.freesoft.org/CIE/RFC/1521/6.htm
function quoted_printable_encode ( $string ) {
// rule #2, #3 (leaves space and tab characters in tact)
$string = preg_replace_callback (
'/[^\x21-\x3C\x3E-\x7E\x09\x20]/',
'quoted_printable_encode_character',
$string
);
$newline = "=\r\n"; // '=' + CRLF (rule #4)
// make sure the splitting of lines does not interfere with escaped characters
// (chunk_split fails here)
preg_match_all ( '/.{73}([^=]{0,3})/', $string, $match ); // Rule #1
return implode ( $newline, $match[0] );
}
-----
tamas dot tompa at kirowski dot com
20-Feb-2004 07:46
i have found a bug in pob at medienrecht dot NOSPAM dot org
's qp_enc function. in quoted printable messages need to convert the first pont in the lines too...
here is the fixed code:
function qp_enc( $input = "", $line_max = 76, $space_conv = false ) {
$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);
$eol = "\r\n";
$escape = "=";
$output = "";
while( list(, $line) = each($lines) ) {
//$line = rtrim($line); // remove trailing white
space -> no =20\r\n necessary
$linlen = strlen($line);
$newline = "";
for($i = 0; $i < $linlen; $i++) {
$c = substr( $line, $i, 1 );
$dec = ord( $c );
if ( ( $i == 0 ) && ( $dec == 46 ) ) { //
convert first point in the line into =2E
$c = "=2E";
}
if ( $dec == 32 ) {
if ( $i == ( $linlen - 1 ) ) { // convert
space at eol only
$c = "=20";
} else if ( $space_conv ) {
$c = "=20";
}
} elseif ( ($dec == 61) || ($dec < 32 ) ||
($dec > 126) ) { // always encode "\t", which is *not* required
$h2 = floor($dec/16);
$h1 = floor($dec%16);
$c = $escape.$hex["$h2"].$hex["$h1"];
}
if ( (strlen($newline) + strlen($c)) >=
$line_max ) { // CRLF is not counted
$output .= $newline.$escape.$eol; //
soft line break; " =\r\n" is okay
$newline = "";
// check if newline first character will
be point or not
if ( $dec == 46 ) {
$c = "=2E";
}
}
$newline .= $c;
} // end of for
$output .= $newline.$eol;
} // end of while
return trim($output);
}
pinkpanther at swissonline dot ch
05-Jan-2003 03:31
Sorry, above I mixed up QP-Decode and UrlDecode, the example I gave above is in fact UrlDecode:
function UrlDecode($string) {
return preg_replace("/%([0-9A-Fa-f]{2})/e", "chr(hexdec('\\1'))", $string);
}
f.e. replaces '%3F' with '?'
Quoted-printable would be:
function qp_decode($string) {
return preg_replace("/=([0-9A-F]{2})/e", "chr(hexdec('\\1'))", $string);
}
f.e. replaces '=20' with ' '
pob at medienrecht dot NOSPAM dot org
18-Jul-2001 01:06
If you do not have access to imap_* and do not want to use
$message = chunk_split( base64_encode($message) );
because you want to be able to read the source of your mails, you might want to try this:
(any suggestions very welcome!)
function qp_enc($input = "quoted-printable encoding test string", $line_max = 76) {
$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);
$eol = "\r\n";
$escape = "=";
$output = "";
while( list(, $line) = each($lines) ) {
//$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
$linlen = strlen($line);
$newline = "";
for($i = 0; $i < $linlen; $i++) {
$c = substr($line, $i, 1);
$dec = ord($c);
if ( ($dec == 32) && ($i == ($linlen - 1)) ) { // convert space at eol only
$c = "=20";
} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
$h2 = floor($dec/16); $h1 = floor($dec%16);
$c = $escape.$hex["$h2"].$hex["$h1"];
}
if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
$output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
$newline = "";
}
$newline .= $c;
} // end of for
$output .= $newline.$eol;
}
return trim($output);
}
$eight_bit = "\xA7 \xC4 \xD6 \xDC \xE4 \xF6 \xFC \xDF = xxx yyy zzz \r\n"
." \xA7 \r \xC4 \n \xD6 \x09 ";
print $eight_bit."\r\n---------------\r\n";
$encoded = qp_enc($eight_bit);
print $encoded;
madmax at express dot ru
03-Aug-2000 05:41
Some browser (netscape, for example)
send 8-bit quoted printable text like this:
=C5=DD=A3=D2=C1= =DA
"= =" means continuos word.
php function not detect this situations and translate in string like:
abcde=f
gustavf at spamstop dot com
07-Jul-2000 10:25
This function does not recognize lowercase letters as part of the Quoted Printable encoding. RFC 1521 specifies:
Uppercase letters must be used when sending hexadecimal data, though a robust implementation may choose to recognize lowercase letters on receipt.
thomas at kenne dot dk
12-Apr-2000 04:09
Try the imap_8bit function, for converting an 8bit string to a quotad printable string.
sunil at nanjang dot com
11-Oct-1999 07:52
hi. i'm php developer in korean.
quoted print decode works well,
but <font color=blue>quoted_printable_decode(str_replace("=\r\n","",$string)</font> works better when MIME email decode.
MIME mail feeds every 76 char (maybe).
and feeding line tlanslate "=\r\n"
so, it better that use <font color=blue>quoted_printable_decode(str_replace("=\r\n","",$line)</font>
when quoted printable MIME decoding.
I test under php3.0.11,..
| |