作者 muzuiget
 发布 2013-03-13 19:23
 标签 redisposition
Firefox 下载文件名乱码问题由来已久,偶然一两次还可以手动改名,批量下载时简直要亲命,最终我还是写了个通用型的扩展来解决。
下载安装
名字叫 ReDisposition,已经上传到 AMO,并且通过了初步审核。源代码 在 GitHub 上。
免重启扩展,目前体积不到 20K,并且提供一个工具栏按钮以便无痛切换。
 
但是这个扩展不是万能药,不要指望安装上自动解决所有问题,你必须继续阅读下面的技术分析。
乱码问题
这个问题多被 Linux/Mac 用户抱怨,但不是 Firefox 独有的,其它浏览器也一样。不是外国人看不起天朝人而迟迟不解决,因为做错的不是浏览器,而是服务器。
这三篇文章已经详细分析过原因和给出一些临时解决办法:
 Firefox 下载保存时中文文件名乱码之谜
 Firefox 下载保存时中文文件名乱码之谜底
 解决迅雷离线各种恼人问题
长篇大论估计急于找解决方法的仁兄估计没什么耐性看,我这里再简单说一下。
乱码原因
一般情况下,文件名是浏览器从 url 推测出来的,但是某些服务器可能要进行下载统计或者用户认证,url 是像 /download?fid=1234 这样的形式,所以会让浏览器使用了 download 这个无意义名字,但是服务器可以在 http 协议头里定义一个叫 Content-Disposition 的字段来指定文件名,于是又多了一个需要顾及编码问题的地方。
一般服务器会返回的是
Content-Disposition: attachment; filename="foo.bar";
 
浏览器会对 foo.bar 部分用了 UTF-8 解码,如果服务器这里使用了 GBK 的话,就会解码失败。于是浏览器会做些兼容,尝试其它地方配置里定义过的编码,大概有:
 下载引用页的网页编码 
浏览器字体设置中的编码 
操作系统的编码 
之所以在简体中文的 Windows 里没这个问题,因为默认的操作系统编码就是 GBK,所以最后还是蒙对了。而繁体中文的 Windows 的系统编码是 BIG5,Linux/Mac 的系统编码都是 UTF-8,所以结果还是乱码。
如果还是失败怎么办?那浏览器可能直接作为乱码显示出来,或者忽略掉这个字段,回头在 url 里推测。我没看出固定规律,Firefox 多数会是前者,Chrome 多数会是后者。
解决方法
有 4 种方法
第 1 种
因为问题出在服务器,所以根本解决方法是联系网站的开发者,让他们修改,按标准来做,默认使用 UTF-8。不过人家多数不会鸟你的,只要领导在的 Windows 上的 IE 没问题就行了,提高兼容性能涨工资吗?就不用加班了吗?出事你负责吗?那还改毛?
第 2 种
所以只好退回客户端这边解决,可以修改上面 3 个地方的备选编码,网上的流传方法都是如此,但是可能带来的副作用就是本来没问题的网站又有问题了,只是拆东墙补西墙,问题还是没解决。
第 3 种
可以联系浏览器的开发者,让他们专门为这个字段加一个备选编码配置,我已经给 Firefox 提 bug 了,不知道何年何月得偿所望,不过走做路过不要错过请顺手 vote 一下。
第 4 种
那么只好折中一下,也就是这个扩展所做的,干脆把该字段先改成指定编码的形式,再传给下载对话框。
也就是转换成:
Content-Disposition: attachment; filename*=GBK''foo.bar;
 
这里的 GBK 也就是你在工具栏按钮的菜单所指定的,GB18030 也就是 GBK 的超集。
所以如果你发现某个网站下载出现乱码,激活按钮并选一个编码然后再重新下载就行了。临时启用,搞定好后再点按钮禁用就行了。
具体编码可以在扩展首选项里配置,编码间用英文逗号分隔,默认是 GB18030, BIG5。
开发者的选择
对 Content-Disposition 的用法,这里各浏览器的 测试用例和结果,看完后好绝望。尤其是那个极品的奇葩 IE,都 IE 9 了对指定编码形式还不完善。
标准都有好几个,而且浏览器就更多了,但最常见都是上面说的一般和指定编码两种形式。我觉得最简单的兼容方案就是,在服务端先判断浏览器的 User-Agent,不管操作系统:
 对 IE, 就返回一般形式,用 GBK 编码,放弃支持其它语言 Windows 的 IE 用户。 
对非 IE 的,就返回指定编码的形式,现代先进浏览器都支持。 
inline 模式
一个附加小功能,对于像文本和图像这样的文件,某些网站可能也会加那个字段让浏览器提示下载的,但你想直接显示在浏览器里,只要那个字段改成 inline 就行了。
可以用 这个图片 测试,用了 Google 的图片代理,点击会弹出保存为 p.txt 的提示,但是切换到 inline 模式后,再点击就会在浏览器里直接显示了。
当然,对于 Firefox 不支持直接打开的文件,例如压缩包,还是会直接提示保存的。
总结
你或许说像 Adblock Plus 那样弄个白名单机制,对有乱码出现的网站自动处理,不用点按钮就好了。我一开始也打算这么做的。因为我发现百度网盘也是乱码的,于是修改那个迅雷离线的扩展,添加百度网盘支持,但让我崩溃的是,同一个下载列表页面里,居然有些文件使用 GBK,有些文件使用 UTF-8,而且无法通过 url 判断。所以我就死了这条心了,改成用工具栏按钮临时启用。
当我完成这个扩展时,才想起,直接在下载对话框里加个转换按钮直接转不就好了吗?省得还要取消对话框,激活扩展按钮,然后重新点下载,这个还是以后再说吧。

解决 Firefox 下载文件名乱码扩展 ReDisposition的更多相关文章

  1. 解决wget下载文件名乱码的一些方法

    在下载用apache或者nginx做的索引目录时,遇到文件名乱码问题.搜索了不少资料,尝试了好几种方案,大家可以结合使用. 一般情况下加上–restrict-file-names=nocontrol参 ...

  2. Firefox下载附件乱码的解决办法

    通过在http的header里设置fileName下载附件时,中文文件名通过chrome浏览器下载时正常,通过firefox下载时为乱码: 原来的Java代码: response.addHeader( ...

  3. 【.net】在ASP.NET中,IE与Firefox下载文件名中带中文汉字的文件,文件名乱码的问题

    #问题:客户端为ie或Firefox,服务端为asp.net时,下载文件名中包含中文汉字时,下载下来的文件的文件名是乱码: #解决方案: 示例代码:下载名称中带汉字的文件: public void P ...

  4. C#导出Excel文件Firefox中文件名乱码

    首先说明下:我的解决方法不一定适用于其他遇到该问题的人,因为情况多种多样,适合我的方法不一定适合别人,就像我在遇到问题时查到别人的解决方案放到我的代码里却不管用,所以这个方法仅供参考 这两天做了一个导 ...

  5. Linux 解决 firefox 中文页面乱码问题

    1.由于 firefox 默认是允许网页自己选择字体,在 Linux 上便会出现部分网站的乱码情况.因此可以取消允许页面自己选择字体这个选项便能解决部分乱码情况.

  6. 解决PHP在IE浏览器下载文件,中文文件名乱码问题

    前提:我们网站所有文件全部使用的是UTF-8 NO BOM的编码方式 1.找测试重现.360浏览器下载的呵呵,果然文件名是乱码.再请测试在ie浏览器下测试.IE9,8,7也全部是乱码.查看编码就是UT ...

  7. 利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码

    利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码 2014-07-31 12:53 1047人阅读 评论(0) 收藏  ...

  8. C#中解决Response.AddHeader("Content-Disposition", "attachment; filename=" + filename)下载文件时文件名乱码的问题

    问题:下载文件时文件名乱码怎么解决? 在C#写后台代码过程中,经常遇到下载文件出现文件名乱码的问题,在网上找了很多方法,总是存在浏览器不兼容的问题,当IE浏览器不乱码时,火狐浏览器就会乱码,后来经过反 ...

  9. 在ASP.NET中,IE与Firefox下载文件带汉字名时乱码的解决方法

    解决办法: HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Buffer = true; HttpContext. ...

随机推荐

  1. 使用k8s operator安装和维护etcd集群

    关于Kubernetes Operator这个新生事物,可以参考下文来了解这一技术的来龙去脉: https://yq.aliyun.com/articles/685522?utm_content=g_ ...

  2. CentOS 7命令行安装GNOME、KDE图形界面

    https://www.linuxidc.com/Linux/2018-04/152000.htm

  3. ERROR 2003:Can't connect to MySQL server on 'localhost'

    mysql出现10061错误解决办法 如果出现"ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)", ...

  4. thinkphp中AJAX返回ajaxReturn()方法分析

    本文分析了thinkphp中AJAX返回ajaxReturn()方法.分享给大家供大家参考,具体如下: 系统支持任何的AJAX类库,Action类提供了ajaxReturn方法用于AJAX调用后返回数 ...

  5. 转载收藏用<meta name="ROBOTS"

    SEO优化meta标签 name="robots" content="index,follow,noodp,noydir"解释 (2012-10-11 10:33:08)转载   SEO优化meta标 ...

  6. 030.Zabbix分布式部署

    一 分布式Zabbix介绍 zabbix proxy 可以代替 zabbix server 收集性能和可用性数据,然后把数据汇报给 zabbix server,并且在一定程度上分担了zabbix se ...

  7. grant 权限 on 数据库对象 to 用户

    grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant select on testdb.* to common_ ...

  8. 模拟页面获取的php数据(三)

    <?php return array( "aData" => [//通勤方式 "trafficType" => [ 0 => [ &qu ...

  9. Leetcode分类总结(Greedy)

    贪心类题目目前除了正则匹配(Wildcard Matching)(据说其实是DP)那道还没做其他的免费题目都做了,简单做个总结. 贪心的奥义就是每一步都选择当前回合”可见范围“(即可得知的信息)内的最 ...

  10. 10.24 正睿停课训练 Day8 AM

    目录 2018.10.24 正睿停课训练 Day8 AM A 棒棒糖(组合) B 彩虹糖(思路 博弈) C 泡泡糖(DP) 考试代码 A B C 2018.10.24 正睿停课训练 Day8 AM 期 ...