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

Re: search and multibyteness



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

>> (insert ?\200 "\200")

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

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

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

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

> ??? STRING2 が (insert "\200") した結果を切り出したものだと
> すると、それは lang. env. によっては通常の文字になるので、ま
> ずくないでしょうか?

はい、例えば Russian lang. env. では通常の文字ですね。

この search を行なうときに挿入される summary 行は、通常メールや
ニュースを読んでいる本番のものとは別の、テスト専用のものです。こ
のことをちゃんと書いておかないと、意味が通じませんでしたね。すみ
ません。

あるいは、別の心配がありますか?

その、Russian lang. env. では罫線素片のように見える通常の文字は、
カラム位置を探すだけのために、次の二つのどちらかの方法で
multibyte バッファに挿入される (またはユーザの設定によっては挿入
されない) 文字のうち、後者にマッチします。

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

このテストのために作られる summary 行は、subject や送信者名など
が空文字になっていて、探す対象以外に \200 に相当する文字が無いこ
とが保証されるので、

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

このフォームは前記の二つのやり方のどちらかで挿入された (または、
されなかった) \200 に相当する文字を確実に探すことができます。

いったんバッファに書いてみて、それを切り出す手法を使ったもう一つ
の理由は、string-make-multibyte 関数などを使っても、XEmacs で
warning が出ないようにする対策をしないでも良いことでした。