emy - SJIS text Attachment

Yoshiki Hayashi yoshiki @ xemacs.org
2000年 11月 29日 (水) 15:06:07 JST


Yoshihiko Yamada <yyamada @ cac.co.jp> writes:

> CACの山田です。
> 前から、この話題ばかりで、恐縮です。

毎回 bug report をしていただいてありがとうございます。

> EMY-1.13.9 で sjis の text を mime-edit-insert-file したところ
> charset=iso-2022-jp
> となってしまいました。

すみません。かなりぼけてました。私の環境では以下の patch で
とりあえず日本語のファイルは大丈夫なことを確認しました。
# ますます何だかなぁという code になりつつありますが。(^^;;

-------------- next part --------------
Index: mime-edit.el
===================================================================
RCS file: /cvs/root/semi/mime-edit.el,v
retrieving revision 1.35.2.17.4.19
diff -u -r1.35.2.17.4.19 mime-edit.el
--- mime-edit.el	2000/10/16 15:06:34	1.35.2.17.4.19
+++ mime-edit.el	2000/11/29 05:45:48
@@ -1138,6 +1138,43 @@
 	 (forward-char (cadr ret))
 	 (mime-edit-force-text-tag mime-edit-single-part-regexp))))))
 
+(defun mime-edit-guess-charset (file)
+  (with-temp-buffer
+    (let (candidates candidate eol eol-string)
+      (set-buffer-multibyte nil)
+      (insert-file-contents-as-binary file)
+      (setq candidates (detect-coding-region (point-min) (point-max)))
+      (setq candidate (if (listp candidates)
+			  (car candidates)
+			candidates))
+      (setq eol (coding-system-eol-type candidate))
+      (cond ((eq eol
+		 (static-if (featurep 'xemacs)
+		     'lf
+		   0))
+	     (setq eol-string "\n"))
+	    ((eq eol
+		 (static-if (featurep 'xemacs)
+		     'cr
+		   2))
+	     (setq eol-string "\r")))
+      (goto-char (point-min))
+      (when eol-string
+	(while (search-forward eol-string nil t)
+	  (replace-match "\r\n")))
+      (static-if (featurep 'xemacs)
+	  (setq candidate (coding-system-name (coding-system-base candidate)))
+	(setq candidate (coding-system-base candidate)))
+      ;; #### FIXME
+      (cond ((eq candidate 'undecided)
+	     (setq candidate "us-ascii"))
+	    ((eq candidate 'iso-2022-7bit)
+	     (setq candidate "iso-2022-jp"))
+	    (t
+	     (setq candidate
+		   (symbol-name (coding-system-to-mime-charset candidate)))))
+      (cons candidate (buffer-string)))))
+
 (defun mime-edit-insert-file (file &optional verbose)
   "Insert a message from a FILE.
 If VERBOSE is non-nil, it will prompt for Content-Type,
@@ -1150,7 +1187,7 @@
 	  (encoding (nth 3 guess))
 	  (disposition-type (nth 4 guess))
 	  (disposition-params (nth 5 guess))
-	  string)
+	  charset-and-string)
     (if verbose
 	(setq type    (mime-prompt-for-type type)
 	      subtype (mime-prompt-for-subtype type subtype)))
@@ -1162,38 +1199,10 @@
 	(let ((rest parameters) cell attribute value)
 	  (setq parameters "")
 	  (when (string= type "text")
-	    (with-temp-buffer
-	      (let (candidates candidate eol eol-string)
-	      (set-buffer-multibyte nil)
-	      (insert-file-contents-as-binary file)
-	      (setq candidates (detect-coding-region (point-min) (point-max)))
-	      (setq candidate (if (listp candidates)
-				  (car candidates)
-				candidates))
-	      (setq eol (coding-system-eol-type candidate))
-	      (cond ((eq eol
-			 (static-if (featurep 'xemacs)
-			     'lf
-			   0))
-		     (setq eol-string "\n"))
-		    ((eq eol
-			 (static-if (featurep 'xemacs)
-			     'cr
-			   2))
-		     (setq eol-string "\r")))
-	      (goto-char (point-min))
-	      (when eol-string
-		(while (search-forward eol-string nil t)
-		  (replace-match "\r\n")))
-	      (setq string (buffer-string))
-	      ;; ####
-	      (set-buffer-multibyte t)
-	      (erase-buffer)
-	      (insert (decode-coding-string string candidate))
-	      (setq parameters
-		    (concat parameters "; charset="
-			    (symbol-name (detect-mime-charset-region
-					  (point-min) (point-max))))))))
+	    (setq charset-and-string (mime-edit-guess-charset file))
+	    (setq parameters
+		  (concat parameters "; charset="
+			  (car charset-and-string))))
 	  (while rest
 	    (setq cell (car rest))
 	    (setq attribute (car cell))
@@ -1222,8 +1231,8 @@
     (mime-edit-insert-place
      (list type subtype)
      (mime-edit-insert-tag type subtype parameters)
-     (if string
-	 (mime-edit-insert-binary-string string encoding)
+     (if charset-and-string
+	 (mime-edit-insert-binary-string (cdr charset-and-string) encoding)
        (mime-edit-insert-binary-file file encoding)))))
 
 (defun mime-edit-insert-external ()
-------------- next part --------------

> で、これは カーソルが Nana-Gnus の article buffer の 途中で実行した時で
> カーソルがbuffer の 最後の位置で同様に mime-edit-insert-file すると
> 以下のエラーになります。

これ、backtrace を見た感じでは、送信時のエラーのように見えま
す。Debian woody にある Emacs 20.7 と EMY 1.13.9 と
Wanderlust で test してみたのですが、私の環境では再現しませ
ん。山田さんの環境では必ず発生するのでしょうか? ちょっと今
Nana-gnus の環境が無いので確かめられませんが、どうも buffer
が narrow されているときの next-single-property-change の挙
動の違いのような気がします。

mime-edit-content-end の
(next-visible-point (point))
を
(next-single-property-change (point) 'mime-edit-invisible nil (point-max)))
とすると直ったりしますでしょうか。

-- 
Yoshiki Hayashi


More information about the Emacs-mime-ja mailing list