火狐默认用ISO-8859-1解析Content-Disposition导致中文文件名乱码,可通过安装“Download Filename Fixer”选GBK编码、或“Download Auto Save”配置正则规则修复;服务器端应显式声明filename*=UTF-8''并URL编码;临时可手动重命名。
你下载合同PDF时文件名变成“%E5%90%88%E5%90%8C%E8%BD%AC%E6%8D%A2.pdf”,点击安装包却生成“setup%0d%0a.exe”——火狐对未声明编码的文件名会自动URL解码或截断,导致中文乱码、换行符残留、空格变下划线。这不是浏览器bug,而是它默认用ISO-8859-1解析响应头中的Content-Disposition字段。
方法一:安装“Download Filename Fixer”扩展(2024年更新,兼容Firefox 128+)
① 访问addons.mozilla.org搜索该扩展→点击“添加到Firefox”→确认权限;
② 安装后右键工具栏图标→选择“选项”;
③ 在“默认编码”下拉菜单中选【GBK】(简体中文网站90%适用),勾选“检测UTF-8”和“检测百分号编码”;
④ 关闭选项页,下次下载即生效——扩展会拦截所有下载请求,重写文件名编码逻辑。
方法二:改用“Download Auto Save”扩展(支持MIME类型+文件名双规则)
这扩展能同时处理文件类型分流和文件名清洗,但配置稍复杂:
• 安装后进入设置→“Filename Rules”标签页;
• 点击“Add Rule”,在Pattern框填.*合同.*,Replacement填Contract_${date}_${seq};
• 再建一条规则:Pattern填.*[0-9]{4}.*(匹配含年份的文件),Replacement填${basename}_${year};
【注意:正则表达式区分大小写,测试时先用小写字母文件名验证】
如果你控制着被下载的网站后端,直接修复源头最彻底:
• ASP.NET Core示例中,关键不是Base64编码本身,而是必须在Content-Disposition头里显式声明charset:Content-Disposition: attachment; filename*=UTF-8''%E5%90%88%E5%90%8C.pdf;
• PHP中用header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($filename));;
• Node.js Express需调用res.attachment(encodeURI(filename))而非直接传中文字符串。
这一步不做,前端扩展只能做兜底修复,无法解决服务器返回filename="合同.pdf"这种无编码声明的原始情况。
当遇到单个乱码文件急需使用时:
• 下载完成后立即右键该文件→选择“重命名”;
• 输入正确名称(如“2024采购合同.pdf”),按回车确认;
• 如果系统提示“无法重命名”,说明文件正被Firefox进程占用,先关闭下载完成通知横幅再试。