@
lightening 嗯,谢谢。
是这样,原始的代码,最终体现到页面上,是这样的:
<img src="/attachments/download/455/02%E5%AE.jpg">
但是这张图片并不显示,如果你直接点击这个图片,会提示一段 HTML 代码,说这个文件不存在,而不存的文件名,并不是"02%E5%AE.jpg",而是一个“乱码.jpg ”,换句话说,直接点击,会告诉你
http://URL/attachments/download/455/乱码乱码乱码.jpg 不存在
看上去,像是 Windows 下的 Ruby ,或者是源代码,对中文文件名的处理有一点问题。
所以我就寻找解决方案,最彻底的方案当然是找到乱码的原因,不过这个不好找,我找了一个妥协的方案,那就是,我发现其实直接把文件名去掉的话,是能显示的,就是说
<img src="/attachments/download/455/">
是可以正常显示的。所以我就想,只要能找到生成这一段代码的 Ruby 源码,生成的字符串,将最后一个“/”之后的字符全删掉,不就行了么?
于是我就找到了这一部分,这一部分的源码是这样的:
def inline_textile_image( text )
text.gsub!( IMAGE_RE ) do |m|
stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8]
htmlesc title
atts = pba( atts )
atts = " src=\"#{ htmlesc url.dup }\"#{ atts }"
atts << " title=\"#{ title }\"" if title
atts << " alt=\"#{ title }\""
# size = @
getimagesize($url);
# if($size) $atts.= " $size[3]";
href, alt_title = check_refs( href ) if href
url, url_title = check_refs( url )
out = ''
out << "<a#{ shelve( " href=\"#{ href }\"" ) }>" if href
out << "<img#{ shelve( atts ) } />"
out << "</a>#{ href_a1 }#{ href_a2 }" if href
if algn
algn = h_align( algn )
if stln == "<p>"
out = "<p style=\"float:#{ algn }\">#{ out }"
else
out = "#{ stln }<div style=\"float:#{ algn }\">#{ out }</div>"
end
else
out = stln + out
end
out
end
end
虽然我不懂 Ruby ,不过看上去,这一行就是关键:
atts = " src=\"#{ htmlesc url.dup }\"#{ atts }"
看起来,生成<img>的“ src ”内容的,就是这一句,而这个 htmlesc 显然是一个函数,用于处理 URL.DUP 这个变量(这个我并不知道是什么,看字面意思似乎是将 URL 变量复制了一份?)
于是就有了我上面的问题,我找到了最初对 htmlesc 这个函数的定义,希望通过修改它来达到我的目的。
但奇怪的是,修改后,并没有如我想象的写回
<img src="/attachments/download/455/">
写回的是
<img src="">
所以我猜测,也许后面对输出的字符串还是做了什么修改,高度怀疑这几句:
out = ''
out << "<a#{ shelve( " href=\"#{ href }\"" ) }>" if href
out << "<img#{ shelve( atts ) } />"
out << "</a>#{ href_a1 }#{ href_a2 }" if href
但是这个语法我就看不太懂了…………现在就卡在这里了………………