changeset 73681:e1c32a83bd29

(rmail-redecode-body): New optional argument RAW. Don't encode body if RAW is non-nil, or if the old encoding is identical to the new encoding, or if the body contains only eight-bit-* characters.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 04 Nov 2006 15:38:39 +0000
parents a171b46b168c
children 79ec7e90e5c4
files lisp/mail/rmail.el
diffstat 1 files changed, 29 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/mail/rmail.el	Sat Nov 04 14:49:12 2006 +0000
+++ b/lisp/mail/rmail.el	Sat Nov 04 15:38:39 2006 +0000
@@ -2828,7 +2828,7 @@
 	(if blurb
 	    (message blurb))))))
 
-(defun rmail-redecode-body (coding)
+(defun rmail-redecode-body (coding &optional raw)
   "Decode the body of the current message using coding system CODING.
 This is useful with mail messages that have malformed or missing
 charset= headers.
@@ -2838,6 +2838,16 @@
 decode it was incorrect.  It then encodes the message back to its
 original form, and decodes it again, using the coding system CODING.
 
+Optional argument RAW, if non-nil, means don't encode the message
+before decoding it with the new CODING.  This is useful if the current
+message text was produced by some function which invokes `insert',
+since `insert' leaves unibyte character codes 128 through 255 unconverted
+to multibyte.  One example of such a situation is when the text was
+produced by `base64-decode-region'.
+
+Interactively, invoke the function with a prefix argument to set RAW
+non-nil.
+
 Note that if Emacs erroneously auto-detected one of the iso-2022
 encodings in the message, this function might fail because the escape
 sequences that switch between character sets and also single-shift and
@@ -2849,7 +2859,8 @@
     (or (eq major-mode 'rmail-mode)
 	(switch-to-buffer rmail-buffer))
     (save-excursion
-      (let ((pruned (rmail-msg-is-pruned)))
+      (let ((pruned (rmail-msg-is-pruned))
+	    (raw (or raw current-prefix-arg)))
 	(unwind-protect
 	    (let ((msgbeg (rmail-msgbeg rmail-current-message))
 		  (msgend (rmail-msgend rmail-current-message))
@@ -2883,7 +2894,22 @@
 			      (car (find-coding-systems-region msgbeg msgend))))
 		    (setq x-coding-header (point-marker))
 		    (narrow-to-region msgbeg msgend)
-		    (encode-coding-region (point) msgend old-coding)
+		    (and (null raw)
+			 ;; If old and new encoding are the same, it
+			 ;; clearly doesn't make sense to encode.
+			 (not (coding-system-equal
+			       (coding-system-base old-coding)
+			       (coding-system-base coding)))
+			 ;; If the body includes only eight-bit-*
+			 ;; characters, encoding might fail, e.g. with
+			 ;; UTF-8, and isn't needed anyway.
+			 (> (length (delq 'ascii
+					  (delq 'eight-bit-graphic
+						(delq 'eight-bit-control
+						      (find-charset-region
+						       msgbeg msgend)))))
+			    0)
+			 (encode-coding-region (point) msgend old-coding))
 		    (decode-coding-region (point) msgend coding)
 		    (setq last-coding-system-used coding)
 		    ;; Rewrite the coding-system header according