`
ljl_xyf
  • 浏览: 634056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

php 下载文件,中文乱码问题

    博客分类:
  • php
php 
阅读更多

通过把Content-Type设置为application/octet-stream, 可以把动态生成的内容当作文件来下载,相信这个大家都会。 那么用Content-Disposition设置下载的文件名, 这个也有不少人知道吧。 基本上,下载程序都是这么写的:

<?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
[/cdoe]
这样用浏览器打开之后,就可以下载document.txt。

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下:
[code]
<?php
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
[/cdoe]
把程序保存成UTF-8编码再访问,IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。

输出的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="<URL编码之后的UTF-8文件名>"  
FF3  attachment; filename="UTF-8文件名"  
attachment; filename*="utf8''<URL编码之后的UTF-8文件名>"  
O9  attachment; filename="UTF-8文件名"  
Safari3(Win)  貌似不支持?上述方法都不行  

这样看来,程序必须得这样写才能支持所有主流浏览器:
[code]
<?php
$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导出csv文件无乱码示例

    然而,由于编码问题,有时在导出CSV文件时会出现乱码。本示例将详细讲解如何使用PHP正确地导出CSV文件,避免出现乱码情况,并介绍相关的关键知识点。 首先,我们需要了解字符编码的基本概念。在处理文本数据时,...

    PHP中文乱码问题解决方法

    最后,解决中文乱码问题可以使用一种更好的解决方法,即生成一个只有字母和数字的序列作为文件名,而将原来带有中文的名字保存在数据库中,这样调用move_uploaded_file()就不会出现问题,下载的时候只需将文件名改为...

    PHP之JPgraph横坐标中文乱码问题

    ### PHP之JPgraph横坐标中文乱码问题解析 在处理PHP与JPgraph图表库时,经常遇到的一个问题是中文字符在横坐标上显示为乱码。本文将深入探讨这一问题,并提供一个具体的解决方案。 #### 问题描述 在使用PHP结合...

    PHP向mysql插入中文乱码问题,php文件内容写入数据库!

    以下将详细分析并解决PHP向MySQL插入中文乱码问题,以及如何正确处理PHP文件内容写入数据库。 首先,我们需要确保数据库的编码设置正确。MySQL数据库通常使用UTF-8编码,因此创建数据库和表时应指定`CHARACTER SET ...

    完美解决PHP中文乱码问题

    ### 完美解决PHP中文乱码问题:深入解析与实用指南 #### 一、理解PHP中文乱码问题 在PHP编程中,中文乱码问题是开发者经常遇到的挑战,尤其是在处理多语言网站或应用时。这一问题主要源于字符集编码不一致,即数据...

    flex 文件上传 预览下载 及中文名乱码解决问题

    本篇文章将详细介绍如何在Flex中实现文件上传、预览、下载功能,并解决中文文件名在这些操作中可能出现的乱码问题。 首先,文件上传是通过HTTP的POST请求来实现的。在Flex中,我们可以使用`URLLoader`类来发送数据...

    php生成pdf,解决中文乱码

    然而,当涉及到中文字符时,可能会出现乱码的问题。本文将深入探讨如何在PHP中生成包含中文字符的PDF,避免乱码现象,并提供一个具体的小票格式实例作为参考。 首先,我们需要了解PDF文档的编码原理。PDF支持多种...

    1.PHP使用插件fpdf fpdi 给PDF文件加水印(中文乱码)

    本文将详细讲解如何利用这两个插件为PDF文件添加水印,尤其是解决中文乱码的问题。 首先,fpdf是一个开源的PHP类库,它允许我们在服务器端生成PDF文件。fpdf提供了丰富的API,可以方便地创建、编辑和打印PDF文档。...

    PHP+MySql中文乱码解决办法

    在使用PHP+MySQL进行开发的过程中,中文乱码问题是常见的一个问题。乱码现象通常发生在从数据库查询中文数据时,显示出来的中文变成了不可识别的符号或者问号。产生这种现象的主要原因是**编码不一致**。 1. **...

    解决生成csv文件出现的乱码问题

    大家一般都会知道到生成的csv文件,中文或其他的语言会出现乱码的问题,这是因为csv它不支持utf-8的原因,在我上传的这个文件中已经很好的解决了它的乱码的问题,如果不会使用可以给我留言

    php使用fgetcsv读取csv文件出现乱码的解决方法

    一般来说在php中碰到乱码多半是编码问题,在这里我们实例分析了fgetcsv读取csv文件乱码原因所在与解决方法。 例子如下: 复制代码 代码如下:function get_csv_contents( $file_target ){  $handle = fopen&#40; $...

    php中文乱码.zip

    1. **PHP文件编码**:确保PHP源代码文件使用统一的编码,最好是UTF-8无BOM格式,以避免文件内部的乱码问题。 2. **数据库编码**:如果数据存储在数据库中,要确保数据库、表和字段的编码与PHP应用使用的编码一致,...

    apache+mysql+php 乱码问题.docx

    通过这三个文件的配置,可以解决 Apache、MySQL 和 PHP 的乱码问题,从而确保 Web 应用程序正确地显示中文。 此外,还需要注意,在使用 PHPMyAdmin 时,需要选择正确的语言和编码,以便正确地显示中文。在 MySQL 的...

    PHP+MySql中文乱码解决方案

    在使用PHP与MySQL进行Web开发的过程中,中文乱码问题是常见的一个问题。通常情况下,这主要是由于系统各部分(如PHP脚本、MySQL数据库、操作系统等)之间的字符编码设置不一致所引起的。解决乱码问题的关键在于确保...

    完美解决PHP中文乱码

    在处理PHP中文乱码问题时,首要任务是确保PHP文件本身的编码与其所声明的网页编码相匹配。这涉及到设置正确的HTTP头部信息以及调整文件的实际编码格式。 ##### 1. PHP文件与网页编码匹配 - **GB2312编码**: - ...

    php中文乱码解决方案

    这样在调用`move_uploaded_file()`时不会出现问题,同时在下载时通过将文件名改回原始带有中文的文件名即可实现中文文件名的下载。 **示例代码:实现中文文件名下载** ```php header("Pragma: public"); header(...

    Vtiger-5.2.1-导出数据文件Excel及CSV中文乱码问题完美修正包

    在处理中文数据时,用户可能会遇到一个常见问题:当他们尝试导出数据到Excel或CSV格式时,中文字符显示为乱码。这个问题通常是由于字符编码不兼容或者配置不当引起的。 首先,我们要理解乱码的根源。在计算机系统中...

    mysql汉字乱码问题

    MySQL中的汉字乱码问题是一个常见的困扰许多开发人员和数据库管理员的问题。这主要涉及到字符编码设置不正确,导致在存储或显示汉字时出现乱码。在MySQL中,字符集是用来定义如何存储和处理字符的规则,它包括服务器...

    Linux下中文文件名乱码问题的详解 - CSDN博客1

    文章中提到,作者在项目中遇到了生成的压缩包文件(可能是通过tar或gzip命令创建的)在Linux下显示中文文件名时出现乱码的问题。他们发现,Windows系统默认使用GBK编码,而Linux默认使用UTF-8编码,因此在处理文件名...

Global site tag (gtag.js) - Google Analytics