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

Ruby中邮件附件的代码,给解释就给分,该如何解决

2012-04-02 
Ruby中邮件附件的代码,给解释就给分Python code if m.dispositionfilename m.disposition_param(filena

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

Python code
 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

热点排行