[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 メーリングリストの案内