新井です。

In message "[ruby-list:31787] MIME decoding"
  on 08 Oct 2001 22:48:14 +0900,
  Tietew <tietew / tietew.net> wrote:
> Tietew です。
> 
> メールの Subject: を euc-jp 変換する (MIME decoding) のに 
> NKF::nkf('-e', subject) を使ったところ,
> 
> 「=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= english」が「日本語english」
> とスペースが抜けてしまいました。
> これでは格好悪いので考えた末
> 
> def mime_dec(str)
>   return nil unless str
>   str = str.tr("\0\1", "")
>   str.gsub!(/(\s*)\n/) { $1.empty? ? ' ' : $1 }
>   str = NKF::nkf('-em0', str)
>   str.gsub!(/=\?[\w\d\-]+\?[BQbq]\?.*?\?=/) { "\0" + NKF::nkf('-e', $&) + "\1" }
>   str.gsub!(/\001\s*\000/, "")
>   str.tr!("\0\1", "")
>   str
> end
> 
> なんてコードを書いたのですが,もっとエレガントな方法は無いもので
> しょうか(^^;
> 
> ちなみに,nkf 1.71 でも 1.92 でも同じ挙動を示すみたいです。

思い付くままに base64.rb を書き換えてみました。深い事は考え
てませんが、詳しい人がより良いライブラリにしてくれることを期
待しますです。

# gsub のブロックで nkf すると漢字が泣き別れたりするかな?

--
新井康司 (Koji Arai)


require 'nkf' module Base64 @@nkf_opt = '-m0 ' case $KCODE[0] when ?e, ?E @@nkf_opt << '-e' when ?s, ?S @@nkf_opt << '-s' end module_function def decode64(str) str.unpack("m")[0] end def decode_b(str) str = str.gsub(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) { NKF.nkf('-J ' + @@nkf_opt, decode64($1)) } str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) { NKF.nkf('-S ' + @@nkf_opt, decode64($1)) } str.gsub!(/\n/, ' ') str.gsub!(/\0/, '') str end def encode64(bin) [bin].pack("m") end # def b64encode(bin, len = 60) # encode64(bin).scan(/.{1,#{len}}/o) do # print $&, "\n" # end # end end if __FILE__ == $0 puts Base64.decode_b("=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= english") end