解析如何在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 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
也谈php网站在线人数统计
Apr 09 PHP
php ios推送(代码)
Jul 01 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
CI框架文件上传类及图像处理类用法分析
May 18 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
Yii框架自定义数据库操作组件示例
Nov 11 PHP
php实现自动生成验证码的实例讲解
Nov 17 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 操作excel文件的方法小结
2009/12/31 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
canvas实现钟表效果
2017/02/13 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
详解Python的Django框架中的通用视图
2015/05/04 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
替换python字典中的key值方法
2018/07/06 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
python解析含有重复key的json方法
2019/01/22 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python3安装crypto出错及解决方法
2019/07/30 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
中学生个人自我评价
2014/02/06 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
表彰大会策划方案
2014/05/13 职场文书
公司收款委托书范本
2014/09/20 职场文书
教师先进个人材料
2014/12/17 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
举起手来观后感
2015/06/09 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python