[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: decode-coding-regin() with utf-8



>>>>> In [mule-ja : No.08954] 半田さん wrote:

> set-buffer-multibyte は非常に危い関数です。何せバッファの中の
> unibyte と multibyte をごっちゃにするんですから。もしテキスト
> を何かの coding system でエンコードしたものをまたデコードした
> ければ
>   (decode-coding-string (encode-coding-string STR CODING1) CODING2)
> を使うのが安全です (Emacs 22 でも 23 でも).

わかりました。これからは空でないバッファの multibyteness をいじ
らないことを原則にしようと思います。

[...]

> Emacs 23 で multibyte buffer 中の multibyte character を
> decode-coding-region でどう扱おうかはまだ迷っているのですが、

うーむ、emacs-w3m にしろ Gnus にしろ、そういうコードが結構ありそ
うなのですよ。

> 基本的には decode-coding-region を multibyte-buffer(特に
> unibyte-buffer を (set-buffer-multibyte t) したもの)で使うの
> はお勧めできません。上記についても、どうしても既に unibyte
> buffer にあるものを decode してかつその結果を multibyte
> buffer にしたければ、

> (let ((str (buffer-string)))
>   (erase-buffer)
>   (set-buffer-multibyte t)
>   (insert (decode-coding-string str CODING)))

> のようなことをやるのが安全です。

了解です。さきほど emacs-w3m では、こんなふうにしておきました。

(insert
 (prog1
     (decode-coding-string (buffer-string) 'CODING-SYSTEM)
   (erase-buffer)
   (set-buffer-multibyte t)))

> 2度も余計に string を作るのが無駄なように思えますが、空でない
> バッファでのset-buffer-multibyte はそれなりに重い処理なのでど
> ちらが速いかは一概には言えません。

なるほど。

> ちなみに Emacs 23 では

> (let ((str (buffer-string)))
>   (erase-buffer)
>   (set-buffer-multibyte t)
>   (decode-coding-string str CODING (current-buffer)))

> や、別のバッファを返してよいのなら

> (let ((buf (generate-new-buffer "*work*")))
>   (decode-coding-region (point-min) (point-max) 'iso-8859-1 buf)
>   buf)

> という技も使えます。

>> それから、これに関連して、[2] のやり方では扱うデータによっては
>> decode-coding-region の時点で Emacs 23.0.0 がクラッシュするとい
>> う報告があります[3]。それを再現するコードを作ってみました。やり
>> 方はともかく、こういう条件で Emacs がクラッシュしてはいけないの
>> ですよね。

> おっと、 testcase を有難うございます。今修正を commit しまし
> た。

どうもありがとうございます。後で試します。
-- 
山岡