解析如何在PHP下载文件名中解决乱码的问题_php技巧

通过把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';
?>

时间: 2024-10-30 17:19:37

解析如何在PHP下载文件名中解决乱码的问题_php技巧的相关文章

如何在PHP下载文件名中解决乱码

通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来下载,相信这个大家都会.那么用Content-Disposition设置下载的文件名,这个也有不少人知道吧.基本上,下载程序都是这么写的: <?php $filename = "document.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: a

解析使用substr截取UTF-8中文字符串出现乱码的问题_php技巧

我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案.看这样一段代码吧(字符编码为UTF-8): 复制代码 代码如下: <?$str = '都知道strlen与mb_strlen是求字符串长度的函数';echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');?> 运行上述代码,返回值如下:6634怎么样?strlen中,中文是三个字节的长度,英文则是一个字节的长度!mb

跨浏览器PHP下载文件名中的中文乱码问题解决方法

 这篇文章主要介绍了跨浏览器PHP下载文件名中的中文乱码问题解决方法,涉及php针对中文编码的转码技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了跨浏览器PHP下载文件名中的中文乱码问题解决方法.分享给大家供大家参考.具体如下:   代码如下: <?php $ua = $_SERVER["HTTP_USER_AGENT"]; $filename = "中文 文件名.txt"; $encoded_filename = urlencode(

跨浏览器PHP下载文件名中的中文乱码问题解决方法_php技巧

本文实例讲述了跨浏览器PHP下载文件名中的中文乱码问题解决方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <?php $ua = $_SERVER["HTTP_USER_AGENT"]; $filename = "中文 文件名.txt"; $encoded_filename = urlencode($filename); $encoded_filename = str_replace("+", "%20",

JS及J2EE开发中解决乱码的小方法

1.设置HttpServletResponse.setContextType("text/html: charset=utf-8"): 2.在web页面用encodeURIComponent()对查询字符串进行编码.HttpServletRequest.getParameter (name)对特殊字符被进行替换.(如:+)自动替换成" "(空白字符串). 3.在进行查询字符串进行传输时,尽量对其进行base64编码,减少网络传输量.进行base64编码之后 ,必须进

PHP 中文乱码解决办法总结分析_php技巧

一.首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码,那么php要输出头:header("Content-Type: text/html; charset=gb2312″),静态页面添加<meta http-equiv="Content-Type" content="text/html; charset=gb2312″>,所有文件的编码格式为ANSI,可用记事本打开,另存为选择编码为ANSI,覆盖源文

php中autoload的用法总结_php技巧

PHP中提供了Autoload来帮助我们方便的进行文件的包含,但是autoload并非想象的那样能够处理所有的情况,今天就来记录一下前几天遇到的autoload存在的一些问题. 为什么要使用 Autoload 在PHP中使用类时,我们必须在使用前加载进来,不管是通过 require 的方式还是 include 的方式,但是会有两个问题影响我们做出加载的决定. 首先是不知道这个类文件存放在什么地方,另外一个就是不知道什么时候需要用到这个文件.特别是项目文件特别多时,不可能每个文件都在开始的部分写很

PHP中使用file_get_contents抓取网页中文乱码问题解决方法_php技巧

本文实例讲述了PHP中使用file_get_contents抓取网页中文乱码问题解决方法.分享给大家供大家参考.具体方法如下: file_get_contents函数本来就是一个非常优秀的php自带本地与远程文件操作函数,它可以让我们不花吹挥之力把远程数据直接下载,但我在使用它读取网页时会碰到有些页面是乱码了,这里就来给各位总结具体的解决办法. 根据网上有朋友介绍说原因可能是服务器开了GZIP压缩,下面是用firebug查看我的网站的头信息,Gzip是开了的,请求头信息原始头信息,代码如下: 复

详解WordPress中的头像缓存和代理中的缓存更新方法_php技巧

wordpress评论中的头像是使用Gravatar的头像服务(Gravatar官方注册地址:http://en.gravatar.com),用户的缓存头像一般都是固定不变的,所以我们可以将头像缓存到本地来提高我们网站的访问速度. 我的wordpress avatar目录的头像缓存: wordpress头像缓存功能设置方法首先是在根目录下建立一个文件夹avatar,权限755.再在里面放一个默认的头像(default.jpg),没头像的童鞋就会用默认的.代码如下: function my_ava