解析如何在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 insert语法详解
Jun 07 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
PHP中的错误处理、异常处理机制分析
May 07 PHP
php生成静态文件的多种方法分享
Jul 17 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
Nov 06 PHP
laravel 解决Validator使用中出现的问题
Oct 25 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
ZF等常用php框架中存在的问题
2008/01/10 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Python单链表简单实现代码
2016/04/27 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
Python线程threading模块用法详解
2020/02/26 Python
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
高中毕业自我评价
2014/02/08 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
简单谈谈Python面向对象的相关知识
2021/06/28 Python