作者 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. 064 UDF

    一:UDF 1.自定义UDF 二:UDAF 2.UDAF 3.介绍AbstractGenericUDAFResolver 4.介绍GenericUDAFEvaluator 5.程序 package o ...

  2. 解决html5中video标签无法播放mp4问题的办法

    这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...

  3. HDU 2594 (next数组的用法)【KMP】

    <题目链接> 题目大意: 给两个字符串,求第一串的前缀与第二串的后缀匹配的最长序列以及长度. 解题分析: 看到这个求前缀和后缀相同序列的最大长度,我们不难想到KMP中的next数组.做法就 ...

  4. SAC#1 - 组合数

    P3414 SAC#1 - 组合数 组合数的性质,求(1<<(n-1))%mod即可.其实要快速幂. #include<bits/stdc++.h> #define MOD 6 ...

  5. sql注入总结(一)--2018自我整理

    SQL注入总结 前言: 本文和之后的总结都是进行总结,详细实现过程细节可能不会写出来~ 所有sql语句均是mysql数据库的,其他数据库可能有些函数不同,但是方法大致相同 0x00 SQL注入原理: ...

  6. 为什么要使用getter/setter

    变量私有化的好处 1. 在setter中可以加入合法性检查,比如设置颜色的函数中,对于RGB颜色要判断其值在0~255之间. 2. 更新与被设置变量相关的其它变量的值,比如在一个潜水艇模拟系统中,改变 ...

  7. 关于H5在移动端架构的优化设计总结

    各大互联网公司采取的策略 一.百度移动前端首页 1. 对于首屏的静态文件css/js,在上线前全部编译直出到HTML文件中:整个首页的渲染只需要一次请求: 2.使用缓存:把不变的js/css/html ...

  8. gevent实现异步

    # coding:utf-8 import gevent import requests from gevent import monkey # 猴子补丁就是在运行时对代码进行修改 # 由于IO操作非 ...

  9. [BZOJ2879][NOI2012]美食节(费用流)

    设sm为所有p之和,套路地对每道菜建一个点,将每个厨师拆成sm个点,做的倒数第i道菜的代价为time*i. S向每道菜连边<0,p[i]>(前者为代价后者为流量),i菜到j厨师的第k个点连 ...

  10. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...