summaryrefslogtreecommitdiff
path: root/includes/unicode.inc
diff options
context:
space:
mode:
Diffstat (limited to 'includes/unicode.inc')
-rw-r--r--includes/unicode.inc25
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 ("&amp;lt;" becomes "&lt;", not "<").
*