解析如何在PHP下载文件名中解决乱码的问题


Posted in PHP onJune 20, 2013

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

$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。比如把上面那个程序稍稍改一下:
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>

输出的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=""
FF3
attachment; filename="UTF-8文件名"
attachment; filename*="utf8''"
O9
attachment; filename="UTF-8文件名"
Safari3(Win)
貌似不支持?上述方法都不行
这样看来,程序必须得这样写才能支持所有主流浏览器:
$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';
?>
PHP 相关文章推荐
域名查询代码公布
Oct 09 PHP
PHP的单引号和双引号 字符串效率
May 27 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
由php的call_user_func传reference引发的思考
Jul 23 PHP
ThinkPHP的I方法使用详解
Jun 18 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
php微信公众平台开发类实例
Apr 01 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 PHP
PHP7 参数处理机制修改
Mar 09 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 #PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 #PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 #PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 #PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 #PHP
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 #PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 #PHP
You might like
深入分析php中接口与抽象类的区别
2013/06/08 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
用js遍历 table的脚本
2008/07/23 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
深入理解Javascript中的this关键字
2015/03/27 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
Django model序列化为json的方法示例
2018/10/16 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
零基础小白多久能学会python
2020/06/22 Python
Python和Bash结合在一起的方法
2020/11/13 Python
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
会务接待方案
2014/02/27 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers