diff --git a/includes/unicode.inc b/includes/unicode.inc index 511179adf3e01e7a305b6cd7f79d0dc93d3dee73..04751ed79988bc49c941f41ec616ec6670f57737 100644 --- a/includes/unicode.inc +++ b/includes/unicode.inc @@ -233,6 +233,31 @@ function mime_header_encode($string) { return $string; } +/** + * Complement to mime_header_encode + */ +function mime_header_decode($header) { + // First step: encoded chunks followed by other encoded chunks (need to collapse whitespace) + $header = preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=\s+(?==\?)/', '_mime_header_decode', $header); + // Second step: remaining chunks (do not collapse whitespace) + return preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=/', '_mime_header_decode', $header); +} + +/** + * Helper function to mime_header_decode + */ +function _mime_header_decode($matches) { + // Regexp groups: + // 1: Character set name + // 2: Escaping method (Q or B) + // 3: Encoded data + $data = ($matches[2] == 'B') ? base64_decode($matches[3]) : str_replace('_', ' ', quoted_printable_decode($matches[3])); + if (strtolower($matches[1]) != 'utf-8') { + $data = drupal_convert_to_utf8($data, $matches[1]); + } + return $data; +} + /** * Decode all HTML entities (including numerical ones) to regular UTF-8 bytes. * Double-escaped entities will only be decoded once ("&lt;" becomes "<", not "<").