/** * Decode a mime-encoded string to internal charset * * @param string $input Header value * @param string $fallback Fallback charset if none specified * * @return string Decoded string * @static */ public static function decode_mime_string($input, $fallback = null) { // Initialize variable $out = ''; // Iterate instead of recursing, this way if there are too many values we don't have stack overflows // rfc: all line breaks or other characters not found // in the Base64 Alphabet must be ignored by decoding software // delete all blanks between MIME-lines, differently we can // receive unnecessary blanks and broken utf-8 symbols $input = preg_replace("/\\?=\\s+=\\?/", '?==?', $input); // Check if there is stuff to decode if (strpos($input, '=?') !== false) { // Loop through the string to decode all occurences of =? ?= into the variable $out while (($pos = strpos($input, '=?')) !== false) { // Append everything that is before the text to be decoded $out .= substr($input, 0, $pos); // Get the location of the text to decode $end_cs_pos = strpos($input, "?", $pos + 2); $end_en_pos = strpos($input, "?", $end_cs_pos + 1); $end_pos = strpos($input, "?=", $end_en_pos + 1); // Extract the encoded string $encstr = substr($input, $pos + 2, $end_pos - $pos - 2); // Extract the remaining string $input = substr($input, $end_pos + 2); // Decode the string fragement $out .= rcube_imap::_decode_mime_string_part($encstr); } // Deocde the rest (if any) if (strlen($input) != 0) { $out .= rcube_imap::decode_mime_string($input, $fallback); } // return the results return $out; } // no encoding information, use fallback return rcube_charset_convert($input, !empty($fallback) ? $fallback : rcmail::get_instance()->config->get('default_charset', 'ISO-8859-1')); }