解析如何在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 相关文章推荐
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
使用NetBeans + Xdebug调试PHP程序的方法
Apr 12 PHP
php文本转图片自动换行的方法
Mar 13 PHP
PHP生成随机密码类分享
Jun 25 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
php生成二维码
Aug 10 PHP
详解php比较操作符的安全问题
Dec 03 PHP
php for 循环使用的简单实例
Jun 02 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
php格式文件打开的四种方法
Feb 24 PHP
ThinkPHP 3使用OSS的方法
Jul 19 PHP
php原生数据库分页的代码实例
Feb 18 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
Extjs 几个方法的讨论
2010/01/28 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
python getopt 参数处理小示例
2009/06/09 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
python 默认参数问题的陷阱
2016/02/29 Python
Sanic框架应用部署方法详解
2018/07/18 Python
python lxml中etree的简单应用
2019/05/10 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
Python 如何实现访问者模式
2020/07/28 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
方正Java笔试题
2014/07/03 面试题
《影子》教学反思
2014/02/21 职场文书
保护环境标语
2014/06/09 职场文书
法定代表人资格证明书
2014/09/11 职场文书
营销计划书
2015/01/17 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers