ID: 10489
Updated by: vlad
Old-Status: Open
Status: Closed
Bug Type: IMAP related
PHP Version: 4.0.4pl1
Assigned To: 

Not really a bug. Intended behaviour.

Your $foo is not a valid quoted-printable encoded string (can you get it with 
imap_8bit()? If you can, reopen this bug).

RFC 2045 section 6.7 parts 1 & 2 say that equal sign by itself (ASCII 0x3D) can not be 
represented literally, but onle as encoded "=3D" (hence the '=' at the end of the 
lines is not an equal sign, but a soft break).

Reading below, in note (2):
>An "=" followed by a character that is neither a
>hexadecimal digit (including "abcdef") nor the CR
>character of a CRLF pair is illegal.  This case can be
>the result of US-ASCII text having been included in a
>quoted-printable part of a message without itself
>having been subjected to quoted-printable encoding.  A
>reasonable approach by a robust implementation might be
>to include the "=" character and the following
>character in the decoded data without any
>transformation and, if possible, indicate to the user
>that proper decoding was not possible at this point in
>the data.

Which means that not decoding them at all *might* be a good way to handle that, but 
then it would also be nice to let the user know of the error, which we can't (using 
imap_qprint() at least).

Finally, formal rule for acceptable characters (end of section 6.7 in that RFC) says:

>safe-char := <any octet with decimal value of 33 through
>             60 inclusive, and 62 through 126>
>             ; Characters not listed as "mail-safe" in
>             ; RFC 2049 are also not recommended.
>hex-octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
>             ; Octet must be used for characters > 127, =,
>             ; SPACEs or TABs at the ends of lines, and is
>             ; recommended for any character not listed in
>             ; RFC 2049 as "mail-safe".

Notice, that octet *must* be used for '=' sign. In short, you can create a regular 
expression that can handle encoded data that is malformed (yours is not quite 
correct), but that is not the way PHP should behave. On top of that, imap_qprint 
invokes a function in c_client, so if you want to change that behaviour, you need to 
change c_client.


Previous Comments:

[2001-04-29 06:40:39] [EMAIL PROTECTED]


[2001-04-25 09:51:13] [EMAIL PROTECTED]
quoted_printable_decode() and imap_qprint() decodes control codes aswell. This, I 
assume, is not supposed to happen.

Also, these functions happily translate anything with two characters after the = sign 
(like =EV in =EVIL), which they shouldn't.


$foo="This is =00=01 =E4 "=20" =21 =ev =FE string.";
echo "Quoting string "".$foo.""n";
echo "quoted_printable_decode: "".quoted_printable_decode($foo).""n";
echo "preg_replace:            "".preg_replace("/=([2-9A-Fa-f])([0-9A-Fa-f])/e", 
"''.chr(hexdec('\1\2')).''", $foo).""n";

Would result in:
Quoting string "This is =00=01 =E4 =2B "=20" =21 =ev =FE string."
quoted_printable_decode: "This is   + " " !   string."
preg_replace:            "This is =00=01  + " " ! =ev  string."

Am I wrong in assuming that quoted_printable_decode() and imap_qprint() should act as 
my preg_replace line above does?


ATTENTION! Do NOT reply to this email!
To reply, use the web interface found at

PHP Development Mailing List <>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to