首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

Ruby中邮件附件的代码,给解释就给分解决方法

2013-01-08 
Ruby中邮件附件的代码,给解释就给分 if m.dispositionfilename m.disposition_param(filename)if file

Ruby中邮件附件的代码,给解释就给分


 if m.disposition
              filename = m.disposition_param('filename')
              if filename[0,2]=='=?'
                filename.gsub!(/=\?[^\?]+\?(.)\?([^\?]+)\?=$/){$1=='B' ?
                    $2.unpack('m*') : $2.unpack('M*')}
              end
              begin
                filename = Iconv.iconv("gbk","utf-8",filename).to_s
              rescue => e
                $log.debug(e)
              end
              filename.gsub!("\r\n","")
              filename.gsub!("\n","")
              attaments << filename


1,filename是附件的名称吧?请问为啥会文件名里有 =?这样的字符?
2,后面的filename.gsub!(/=\?[^\?]+\?(.)\?([^\?]+)\?=$/){$1=='B' ?
                    $2.unpack('m*') : $2.unpack('M*')}


谢谢解答,要详细。。。
[解决办法]
1. filename[0,2]=='=?'
   filename 可能是一个数组,
   比如 
   a=[1,2,3]
   puts a[0,2]
   => [1,2]
   至于 =?  就是比较取的值是否是 =? 这个字符串

2.filename.gsub!(/=\?[^\?]+\?(.)\?([^\?]+)\?=$/){$1=='B' ?
  $2.unpack('m*') : $2.unpack('M*')}

  这是ruby 特有的一个语法 
  比如  c == nil? "空值" : "非空" 

  它其实就等于
   if c == nil
     "空值"
   else
     "非空"
   end

  至于gsub!  是一个替换字符串函数,加一个! 是将替换后的结果保存。它里面可以支持正则式。
  象你看到的 /=?[.... 这些都是它写的正则式,至于是什么意思,你要查下正则式规则。后面的 == 'B'。是说如果替换后的字符串的结果等于 B 的话,就如何如何。。。
[解决办法]
首先 
taito所说的
" 这是ruby 特有的一个语法  
  比如 c == nil? "空值" : "非空"
"有问题。

? : 是一个三元操作符,根本不是什么ruby特有的,很多语言里面都有,比如C

filename应该是一个字符串,得到的文件名,"filename[0,2]=='=?'"的意思是看这个文件名是不是以=?开头的。
那个正则表达式的意思是这样的:
=\?[^\?]+\?(.)\?([^\?]+)\?=$ 文件名应该是 =?????内容??????= 
如果文件名的内容部分是B 那么就把红色的问号部分字符串以base64-encoded的方式进行unpack后替换原有部分,否则以quoted-printable的方式unpack并替换。(具体参阅unpack函数)

filename = Iconv.iconv("gbk","utf-8",filename).to_s 将文件名中的的编码方式从utf-8专程gbk

filename.gsub!("\r\n","")
filename.gsub!("\n","")
这两句是删掉带文件名中的换行符!

------解决方案--------------------


filename就是一个字符数组
filename[0,2]=='=?' 判断filename是否以'=?'开头

[解决办法]

1、
filename是一个String,虽然Ruby的String的底层实现可能与Array有关,但是String和Array都是ruby的标准库,这里说filename是个String更合适。
filename[0,2]是这个字符串开头的两个字符。搞不清楚的话,建议看看ruby的文档http://ruby-doc.org/core/classes/String.html#M000771

Mail在传输时会首先转化成某种*神秘的*编码。当然编码方式很多,比如这里用到的base64编码。=?也就在这个编码转换后产生了。可以看一下这个:http://www.people.com.cn/GB/channel5/569/20000904/216147.html

2、
这个匹配,目的是判断编码方式(标志为上为B,是base64编码)。
block内的?:则是选择了一个upack方式进行decode。http://ruby-doc.org/core/classes/String.html#M000760

热点排行