通过把Content-Type设置为application/octet-stream, 可以把动态生成的内容当作文件来下载,相信这个大家都会。 那么用Content-Disposition设置下载的文件名, 这个也有不少人知道吧。 基本上,下载程序都是这么写的:


<?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
[/cdoe]
这样用浏览器打开之后,就可以下载document.txt。

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下:
[code]
<?php
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
[/cdoe]
把程序保存成UTF-8编码再访问,IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。

输出的header实际上是这样子:

Content-Disposition: attachment; filename=中文 文件名.txt其实按照RFC2231的定义, 多语言编码的Content-Disposition应该这么定义:

Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"即:

filename后面的等号之前要加 *
filename的值用单引号分成三段,分别是字符集(utf8)、语言(空)和urlencode过的文件名。
最好加上双引号,否则文件名中空格后面的部分在Firefox中显示不出来
注意urlencode的结果与php的urlencode函数结果不太相同,php的urlencode会把空格替换成+,而这里需要替换成%20
经过试验,发现几种主流浏览器的支持情况如下:

IE6  attachment; filename="<URL编码之后的UTF-8文件名>"  
FF3  attachment; filename="UTF-8文件名"  
attachment; filename*="utf8''<URL编码之后的UTF-8文件名>"  
O9  attachment; filename="UTF-8文件名"  
Safari3(Win)  貌似不支持?上述方法都不行

这样看来,程序必须得这样写才能支持所有主流浏览器:
[code]
<?php
$ua = $_SERVER["HTTP_USER_AGENT"];
$filename = "中文 文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Type: application/octet-stream');
if (preg_match("/MSIE/", $ua)) {  
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {  
header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
} else {  
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
print 'ABC';
?>

转载自 分享

转载于:https://www.cnblogs.com/MRPUNK/archive/2011/09/16/3849322.html

解决PHP下载文件名中文乱码相关推荐

  1. Chrome下载文件名中文乱码问题

    问题 下载文件名出现中文乱码问题 解决 以下方法仅针对Chrome浏览器,不同浏览器有所差异 对于文件名使用UTF-8进行编码,如下: String filename = "人物.jpg&q ...

  2. struts2中解决下载文件名中文乱码问题

    2019独角兽企业重金招聘Python工程师标准>>> 在struts2中xml配置如下,以execl文件为例: <result name="success" ...

  3. 解决导出excel文件名中文乱码的问题

    设置响应头文件名称编码 URLEncoder.encode(fileName, "UTF-8") String fileName = "工作任务办理单"; // ...

  4. php header下载中文名称,PHP Header下载文件在IE文件名中文乱码问题

    解决PHP Header下载文件在IE文件名中文乱码有两种常见的,一种是是把页面编码改成utf8,另一种是对中文url进入urlencode编码就可以解决了. 解决方案一,我的页面是utf-8编码,代 ...

  5. 解决各个浏览器文件下载出现文件名中文乱码问题

    /*** 解决各个浏览器文件下载中文乱码问题* @param filename* @return*/public static String getFileName(HttpServletReques ...

  6. 解决ff浏览器下载文件中文乱码问题

    之前做的Word导出简历功能,前端点完要直接下载,遇到了ff浏览器下载时中文乱码的问题 function exportWord(id) {window.location.href = "/w ...

  7. Linux-Windows主机目录和文件名中文乱码恢复

    目录 Linux->Windows主机目录和文件名中文乱码恢复 声明 一. 乱码问题 二. 调试环境 三. 目录和文件名乱码恢复 3.1 可选方案 3.1.1 通过合适的编解码转换 3.1.2 ...

  8. Linux-Windows主机目录和文件名中文乱码恢复 - clover_toeic - 博客园

    Linux->Windows主机目录和文件名中文乱码恢复 - clover_toeic - 博客园 https://www.cnblogs.com/clover-toeic/p/5235316. ...

  9. 解决VS2010复制代码中文乱码的问题

    解决VS2010复制代码中文乱码的问题     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53305174       ...

最新文章

  1. 2022-2028年中国公路客运行业市场研究及前瞻分析报告
  2. TCPIP / MTU 和 MSS 的区别和联系
  3. JavaScript 变量的作用域和生命周期
  4. mis dss gis_MIS中的决策支持系统(DSS)
  5. instr like 效率_新型固井替代技术 提高井建效率
  6. 这12个GIS软件一个比一个好用
  7. VBA模拟抽签关键代码
  8. MD5简介与代码实现
  9. 国家开放大学2021春1021劳动与社会保障法题目
  10. 【Java】Java的各个版本和各个版本的历史版本号的关系与解读
  11. 定制自己的报表!7款实用开源报表工具
  12. NK/DC细胞膜仿生脂质体药物载体|真核细胞膜包覆仿生纳米粒|肿瘤细胞膜包裹的仿生纳米颗粒
  13. vue+elementUI中使用Echarts (懒人无脑版)
  14. 统计学习方法 | 第7章 支持向量机
  15. 小梅哥——38译码器
  16. FastRNABindR:快速准确预测蛋白质-RNA界面残基
  17. java 树的各种遍历
  18. java steam 去重_List去重的5种方式
  19. 切身体会,debug与release的区别
  20. ETC电子发票台账工(生成Excel报表)

热门文章

  1. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别...
  2. 18、正则表达式中常用字符
  3. 21丨容器化守护进程的意义:DaemonSet
  4. 9.7 top:实时显示系统中各个进程的资源占用状况
  5. python的6种基本数据类型--字典
  6. 独家下载!Java工程师成神必备宝典
  7. html table设置行高_html 表格单元格的宽度和高度的设置方法
  8. 建立海盗的天堂:盗贼之海的AI(一)
  9. WPF游戏,使用move游戏开发
  10. 若某文件系统的目录结构如下图所示,假设用户要访问文件 fault.swf ,且当前工作目录为 swshare ,则该文件的全文件名为( ),相对路径和绝对路径分别为( 请在此空作答