From: Sinichiro Dezawa Date: 1998-11-07T17:16:29+09:00 Subject: [ruby-list:10702] Re: base64.rb ----Next_Part(Sat_Nov__7_17:06:11_1998_731)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit 出沢@フジフイルム です aamine> JISコードのような、エスケープシーケンスがあるコードをエンコードする aamine> 時には、"=?....?="「ごとに」いったんエスケープを閉じなきゃいけない dezawa> dezawa> それはそのとおりですね。覚悟のうえ。;_; は入れて、 aamine> さらに言えば、機種依存文字をそのままエンコードしちゃっていいのかとか、 aamine> 半角カナは全角に変換したいとか、面倒な要素はいくらでもありますね。 これは無視 ^^) というこで作って見ました。 添削宜しく。 base64.rb が良いのか mime.rb がよいのか、、 mime-header.rb かな。 ----Next_Part(Sat_Nov__7_17:06:11_1998_731)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=mime.rb ##### mime.rb ### # $Id: mime.rb,v 1.3 1998/11/07 08:13:33 dezawa Exp $ require "kconv" class String PREFIX = "=?ISO-2022-JP?B?GyRC" def decode64 #(str) Kconv::tojis(self) end def encode64(pre="",len=74,sep="\n\t") str = Kconv::tojis(self) str.encode("",pre,sep,len).sub(/\n\t$/,"") end def encode(ret,wrk,sep,len) # str をencodeして ret,wrk につなげて全体を返す。 # wrk は先行してencodeされた文字列 # ret は先行し、行替えされて吐き出された分。 # len を越えない長さ毎に sep を入れる。 if self =~ /\e\$B(.+?)\e\(B/ lft=$` ; rgt=$' ; tgt=$1 else rgt=tgt=""; lft=self end ret,wrk = lft.ascii_work(ret,wrk,sep,len) ret,wrk = tgt.dbyte_work(ret,wrk,sep,len) if rgt.nil? || rgt==""; return ret+wrk else ;rgt.encode(ret,wrk,sep,len) end end def ascii_work(ret,wrk,sep,len) if self.nil? || self == "" return ret,wrk elsif (wrk+self).length <= len wrk += self; return ret,wrk else ptr = self.rindex("\s",wrk.length-len) if ptr ret += wrk+self[0,ptr]+sep self[0,ptr]="" self.ascii_work(ret,"",sep,len) elsif wrk.length>1 return ret+wrk+sep,self else return ret+wrk+self,"" end end end def dbyte_work(ret,wrk,sep,len) #"=?ISO-2022-JP?B?" + "?=" = 23Byte # \e\$B + \e\(B -> 8Byte / sum=31Byte # --> len - wrk.length - 31 に収まる長さの 日本語文字列か? rest = ((len - wrk.length - 31)*3/8)*2 if self.nil? || self =="" return ret,wrk elsif self.length <= rest return ret,wrk+PREFIX+[self+"\e(B"].pack("m").chop+"?=" elsif rest < 1 ret += wrk+sep;self.dbyte_work(ret,"",sep,len) else ret += wrk+ PREFIX+[self[0,rest]+"\e(B"].pack("m").chop+"?="+sep self[0,rest]="" self.dbyte_work(ret,"",sep,len) end end end ----Next_Part(Sat_Nov__7_17:06:11_1998_731)----