解析如何在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 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
转换中文日期的PHP程序
Oct 09 PHP
php录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
php接口与接口引用的深入解析
Aug 09 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
php错误日志简单配置方法
Jul 11 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP文件与目录操作示例
Dec 24 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 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
15种PHP Encoder的比较
2007/03/06 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
js实现的切换面板实例代码
2013/06/17 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
脚本合并提升javascript性能示例
2014/02/24 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
师范大学应届生求职信
2013/11/21 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
2014年科研工作总结
2014/12/03 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
Python基本数据类型之字符串str
2021/07/21 Python
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
Win11软件图标固定到任务栏
2022/04/19 数码科技