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

Re: search and multibyteness



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

> 一つ書き忘れましたが、Emacs 21 では
>   (insert (string-to-multibyte "\200"))
> は
>   (insert ?\200)
> と同じです。なぜなら multibyte buffer では 128 というコード
> の文字はないので eight-bit-control に属する raw byte として
> 取り扱われるからです。

> しかし、Emacs 22 では異ります。 128 というコードの文字は 
> U+0080 として存在するので、これを挿入します。

半田さんが核心を突かれたので驚きました。実は Gnus が multibyte
のバッファに ?\200 などを挿入する形式は、最初に書いた

(insert (string-as-unibyte "\200"))

ではなくて、以下の 2種類であることが後になってわかったんです。

(insert ?\200)
(insert (format "%c" ?\200))

後者は (insert "\200") と同じです。

;; Gnus の summary バッファに表示する各行には、既読や返信済みな
;; どのマークが表示されるのですが、行のどのカラム位置に表示する
;; かはユーザがカスタマイズすることができます。それらの位置を毎
;; 回探す代わりに、summary mode に入ったときの一回だけ、ユーザ・
;; オプションの設定値に従ってダミー行を挿入してみて、あらかじめ
;; カラム位置を知っておきます。そのときにマークとして挿入するの
;; が \200, \201, \202, \203 の各文字です。

そういう文字を (search-forward STRING nil t) で探すために、以前
は STRING として "\200" を使っていました。その場合でも、ロシアな
どではちゃんと動作しない場合があったようです。最近になって、その
STRING を (string-as-multibyte "\200") で生成するようになったの
ですが、今度は Emacs 22 のユーザから苦情が出ました。

ぼくが使った手法は、STRING の生成を、その multibyte バッファに

(insert ?\200 "\200")

で挿入した二つの文字を buffer-substring で切り出して、

(or (search-forward STRING1 nil t)
    (search-forward STRING2 nil t))

のように使うというものです。

必要だった情報をすべて提供して下さった半田さんに、お礼申し上げま
す。どうもありがとうございます。勝手ながら、半田さんからいただい
たメッセージを丸ごと英訳して、ding に投稿させていただきました。:)

http://article.gmane.org/gmane.emacs.gnus.general/58947