[Date Prev][Date Next][Thread Prev][Thread Next][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 しまし
> た。
どうもありがとうございます。後で試します。
--
山岡