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

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



http://news.gmane.org/group/gmane.emacs.w3m/thread=5249/force_load=t

から始まるスレッドにつなげます。最初の白井さんの記事を要約すると、

  テキストを何かの coding system でエンコードしたものを unibyte
  なバッファに挿入してからデコードするときに、2005年3月の時点の
  Emacs 22.0.50 では、次のような順序で行なうとうまくいかなかった
  ようです。

  ;; [1]
  (decode-coding-region (point-min) (point-max) 'CODING-SYSTEM)
  (set-buffer-multibyte t)

  そこで、これに該当するコードを使っている emacs-w3m では、以下
  のように順序を逆にしました。

  ;; [2]
  (set-buffer-multibyte t)
  (decode-coding-region (point-min) (point-max) 'CODING-SYSTEM)

ところが、現在の Emacs 22.0.50 では [1] のやり方でも問題無いよう
に見えます。加えて、最新の Emacs 23.0.0 では、[1] のやり方を使わ
ないと正しくデコードできません。例えば [2] の場合、Emacs 23.0.0
ではこんなふうになります:

(let ((str (encode-coding-string
	    (string (make-char 'chinese-gb2312 86 80)
		    (make-char 'chinese-gb2312 57 122))
	    'gb2312))
      (default-enable-multibyte-characters nil)
      str1 str2)
  (with-temp-buffer
    (insert str)
    (setq str1 (buffer-string))
    (set-buffer-multibyte t)
    (setq str2 (buffer-string))
    (decode-coding-region (point-min) (point-max) 'gb2312)
    (list str1 str2 (buffer-string))))
 => ("\326\320\271\372"
     "\326■\372"
     #("\326■\301\272" 0 2 (charset chinese-gb2312)))

今後は [1] のやり方に統一しようと思うのですが、ご意見をいただけ
ますか?

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

試す場合は、添付した test.html を /tmp などに置いて下さい。

(let ((buffer (get-buffer-create "*testing*")))
  (with-current-buffer buffer
    (erase-buffer)
    (set-buffer-multibyte nil)
    (let ((coding-system-for-read 'binary))
      (insert-file-contents "/tmp/test.html"))
    (set-buffer-multibyte t)
    (decode-coding-region (point-min) (point-max) 'gb2312))
  (pop-to-buffer buffer))

[3]
http://news.gmane.org/group/gmane.emacs.w3m/thread=5886/force_load=t

Attachment: test.html.gz
Description: GNU Zip compressed data