diff options
Diffstat (limited to 'includes/unicode.inc')
-rw-r--r-- | includes/unicode.inc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/includes/unicode.inc b/includes/unicode.inc index 04751ed79..80ea87714 100644 --- a/includes/unicode.inc +++ b/includes/unicode.inc @@ -259,6 +259,31 @@ function _mime_header_decode($matches) { } /** + * 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 "<"). * |