[Mew-dist 06069] Re: Decoding quoted printable on Emacs-20.3

SAKAI Kiyotaka ksakai at example.com
1998年 8月 21日 (金) 10:13:15 JST


>> In article <19980820154631J.kazu at example.com>, Kazu Yamamoto (山本和彦) <kazu at example.com> writes:

>> Emacs 20.3 では
>> 
>> (concat "\305" "あ")
>> 
>> が "\305あ" ではなくて "Eあ" を返すことが正式な仕様になり、"\305あ" を
>> 返させるためには
>> 
>> (concat (string-as-multibyte "\305") "あ")
>> 
>> とする必要があります。

> よく分からないので教えて下さい。上記のような理由だと、char-to-string 
> を使っているところ全てに同様な問題があると思います。

問題なのは char-to-string ではなくて、concat の仕様です。

Emacs 20.3 では string ごとに single-byte か multi-byte かの属性を持っ
ていますが、concat する string の 1つでも multi-byte の文字が含まれて
いると、single-byte の string は multi-byte の string に変換された上で
concat されます。

single-byte → multi-byte の変換がどのような文字に対して起こるかまでは
把握できていないのですが、"\305" → "Å" の変換が起こることは分かりまし
た。

string-as-multibyte は、string の single-byte の属性を multi-byte に強
制的に変更する機能を持っていますので、この関数を使うことで上の変換を抑
制することができます。

> mew-header-decode-base64 はどうしてうまく動いているのでしょうか?

mew-header-decode-base64 では、たまたま decode され、concat される文字
列に上の変換が起こる文字が含まれていないからだと思います。試してはいま
せんが、latin 文字を B encode すれば mew-header-decode-base64 でも再現
するのではないでしょうか。

厳密にやるなら、Emacs-20.3 では

  (defun mew-concat (&rest args)
    (mapconcat 'string-as-multibyte args ""))

という関数を定義して、変換を抑制する必要のある箇所では concat の代わり
に mew-concat を使うようにすればいいかと思います。
-- 
酒井 清隆 (E-mail: ksakai at example.com)



Mew-dist メーリングリストの案内