From: Koji Arai Date: 2001-10-08T23:47:53+09:00 Subject: [ruby-list:31788] Re: MIME decoding 新井です。 In message "[ruby-list:31787] MIME decoding" on 08 Oct 2001 22:48:14 +0900, Tietew 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