Import Oort Gnus v0.16.
[elisp/gnus.git-] / lisp / mm-bodies.el
index e672e33..b28c50c 100644 (file)
@@ -243,9 +243,10 @@ If TYPE is `text/plain' CRLF->LF translation may occur."
       (while (search-forward "\r\n" nil t)
        (replace-match "\n" t t)))))
 
-(defun mm-decode-body (charset &optional encoding type)
+(defun mm-decode-body (charset &optional encoding type force)
   "Decode the current article that has been encoded with ENCODING.
-The characters in CHARSET should then be decoded."
+The characters in CHARSET should then be decoded.  If FORCE is non-nil
+use the supplied charset unconditionally."
   (if (stringp charset)
       (setq charset (intern (downcase charset))))
   (if (or (not charset)
@@ -271,7 +272,24 @@ The characters in CHARSET should then be decoded."
                   (or (not (eq coding-system 'ascii))
                       (setq coding-system mail-parse-charset))
                   (not (eq coding-system 'gnus-decoded)))
-         (mm-decode-coding-region (point-min) (point-max) coding-system))))))
+         (if force
+             (mm-decode-coding-region (point-min) (point-max)
+                                             coding-system)
+           (mm-decode-coding-region-safely (point-min) (point-max)
+                                           coding-system)))))))
+
+(defun mm-decode-coding-region-safely (start end coding-system)
+  "Decode region between START and END with CODING-SYSTEM.
+If CODING-SYSTEM is not a valid coding system for the text, let Emacs
+decide which coding system to use."
+  (let* ((decoded (mm-decode-coding-string (buffer-substring start end)
+                                          coding-system))
+        (charsets (find-charset-string decoded)))
+    (if (or (memq 'eight-bit-control charsets)
+           (memq 'eight-bit-graphic charsets))
+       (mm-decode-coding-region start end 'undecided)
+      (delete-region start end)
+      (insert decoded))))
 
 (defun mm-decode-string (string charset)
   "Decode STRING with CHARSET."