解析如何在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 使用&(与运算符)引用赋值要注意的问题
Feb 16 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
基于PHP静态类的原罪详解
May 06 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
微信支付开发告警通知实例
Jul 12 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 PHP
tp5修改(实现即点即改)
Oct 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下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
从零学习node.js之模块规范(一)
2017/02/21 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
详解webpack性能优化——DLL
2017/10/20 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
vue中轮训器的使用
2019/01/27 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
复制粘贴功能的Python程序
2008/04/04 Python
python 字符串格式化代码
2013/03/17 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python使用minidom读写xml的方法
2015/06/03 Python
python 基础教程之Map使用方法
2017/01/17 Python
详解python之配置日志的几种方式
2017/05/22 Python
Python使用numpy模块创建数组操作示例
2018/06/20 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
使用python绘制温度变化雷达图
2019/10/18 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
诚信承诺书范文
2014/03/27 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库