[emy] mime-display-gzipped

守岡 知彦 / MORIOKA Tomohiko tomo @ etl.go.jp
2000年 3月 20日 (月) 17:58:54 JST


>>>>> [emacs-mime-ja : No.00491] にて
>>>>> “Yoshiki”= Yoshiki Hayashi <yoshiki @ xemacs.org> さま曰く:

Yoshiki> 寺西さんの patch を FLIM 1.13.2 に当ててしまおうと思っていま
Yoshiki> すが、その後で FLIM 1.13.3 を release して頂きたいです。どう
Yoshiki> でしょう、守岡さん。

保留します。

寺西さんの patch というのが良く判っていないのですが、
<emacs-mime-ja:00488> のことであれば、これ自体は問題ない気もするんです
が、後述するように若干不安要因があります。また、これで直るのだとすると
問題は MEL 層に関連している可能性があり、原因を究明して直したとは言え
ないと思います。

もし、抜本的に直すのなら、mime-entity-content の返り値は unibyte 文字
列であることを明示するような修正が良いと思います。


また、EMY 1.13 の mime-display-gzipped を眺めてみましたが、この code 
は原理的な問題を抱えている気がします。まず、mime-entity-content の返り
値を挿入する temporary-buffer は byte 列ですから unibyte buffer を用意
する必要があります。これの実現の仕方はちょっとうげげではあるんですが、

(let (default-enable-multibyte-characters)
  (with-temp-buffer
    ...)

か  

(with-temp-buffer
  (set-buffer-multibyte nil)
  ...)

見たいな感じでしょうか?

gzip での処理は byte 列の処理ですから unibyte として扱うのが正しいと思
います。

で、問題は decode-coding-region で、これは入力は byte 列、出力は文字列
のような処理だと考えられますが、単一の buffer では byte と文字の見分け
はつかないので、両者の混在状態を作ってしまう decode-coding-region の使
用は望ましくないです。特に、この関数では decode-coding-region を用いる
必然性は全くないと思います。この場合、decode-coding-string を使った方
が無難でしょう。

;; [補足] FLIM/SEMI の世界では以下のことが期待されています:

;; ・整数と文字は違う抽象型として区別する
;; ・byte 列と文字列は違う抽象型として区別する
;; ・byte 列は unibyte で表現する
;; ・文字列は unibyte/multibyte のどちらかを取り得る
;; ・STD 11 の世界は byte 列として解釈する

;;; もちろん、FLIM/SEMI 自体がこの観点から見ておかしい可能性があります
;;; が、その場合は扱っているのが byte 列なのか文字列なのかを判断して適
;;; 切に修正するのが望ましいと思います。


Yoshiki> > ということで、mmbuffer.el の `mime-entity-content' を同様に
Yoshiki> > してみたところ、前述の全てのMUA で問題無く表示できました:-)

Yoshiki> なるほど、今の FLIM の実装だと raw buffer の
Yoshiki> enable-multibyte-characters の値を引き継ぐので、insert 時に
Yoshiki> その buffer で同じ値でないと各 representation に変換されてし
Yoshiki> まうわけですね。

Emacs は文字列を「byte 列」ではなく「文字列」として解釈します。一方、
`mime-entity-content' の返り値は「byte 列」です。よって、意味的には
unibyte 文字列であることが望ましいと言えます。

;; raw-buffer は MUA が unibyte buffer にしているはずなので、MEL が変
;; なことをしてなければ返り値も unibyte になることが期待できる訳です。

また、preview buffer のような概念的に文字列であるところに 
`mime-entity-content' の返り値を挿入するのは誤った操作であると考えられ
ます。


Yoshiki> 寺西さんの patch を当てると、temp buffer と
Yoshiki> enable-multibyte-characters の値が常に同じになるので大丈夫で
Yoshiki> ある、と。

新たに生成される buffer が unibyte か multibyte かを決めるのは変数 
default-enable-multibyte-characters で、<emacs-mime-ja:00488> はこのこ
とを保証していないと思います。また、FLIM 的には multibyte 表現を返すの
はおかしいと言えます。いずれにしてもこの修正が効果を持つのだとすればな
にやら良からぬことが起こっていると考えられます。


という訳で、再検討をお願いします。

-- 
===『幾千億の分子に分かれても ========================================
     決して忘れない。    
     この宇宙が終るまで』              守岡 知彦 (MORIOKA Tomohiko)
======================================== Email: <tomo @ etl.go.jp> =====




More information about the Emacs-mime-ja mailing list