多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP下载文件名乱码问题详解

时间:2018-03-06 17:46:33 [来源]:郑州PHP培训学校

   PHP下载文件名乱码问题详解

  通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来下载,相信这个大家都会。那么用Content-Disposition设置下载的文件名,这个也有不少人知道吧。基本上,下载程序都是这么写的:
  header('Content-Disposition: attachment; filename=' . $filename);print "Hello!";?>
  这样用浏览器打开之后,就可以下载document.txt。
  但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。比如把上面那个程序稍稍改一下:
  header('Content-Disposition: attachment; filename=' . $filename);print "Hello!";?>
  把程序保存成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=""
  FF3 attachment; filename="UTF-8文件名"
  attachment; filename*="utf8''"
  O9 attachment; filename="UTF-8文件名"
  Safari3(Win) 貌似不支持?上述方法都不行
  这样看来,程序必须得这样写才能支持所有主流浏览器:
  $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技术人员网站,总结了国外的十个目前最流行的PHP MVC框架。具体排名顺序未必准确,还有些知名框架,如Kohana等也没有提及。不过仍可以做为一篇不错的参考。
  以下为十个目前最流行的基于MVC设计模式的PHP框架。
  1. Yii
  Yii是一个基于组件的高性能的PHP的框架,用于开发大规模Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主体化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。而且这个框架的价格也并不太高。事实上,Yii是最有效率的PHP框架之一。
  2. CodeIgniter
  CodeIgniter是一个应用开发框架——一个为建立PHP网站的人们所设计的工具包。其目标在于快速的开发项目:它提供了丰富的库组以完成常见的任务,以及简单的界面,富有条理性的架构来访问这些库。使用CodeIgniter开发可以往项目中注入更多的创造力,因为它节省了大量编码的时间。
  3. CakePHP
  CakePHP是一个快速开发PHP的框架,其中使用了一些常见的设计模式如ActiveRecord,Association Data Mapping,Front Controller以及MVC。其主要目标在于提供一个令任意水平的PHP开发人员都能够快速开发web应用的框架,而且这个快速的实现并没有牺牲项目的弹性。
  4. PHPDevShell
  PHPDevShell是一个开源(GNU/LGPL)的快速应用开发框架,用于开发不含Javascript的纯PHP。它有一个完整的GUI管理员后台界面。其主要目标在于开发插件一类的基于管理的应用,其中速度、安全、稳定性及弹性是最优先考虑的重点。其设计形成了一个简单的学习曲线,PHP开发者无需学习复杂的新术语。PHPDevShell的到来满足了开发者们对于一个轻量级但是功能完善,可以无限制的进行配置的GUI的需求。
  5. Akelos
  Akelos PHP框架是一个基于MVC设计模式的web应用开发平台。基于良好的使用习惯,使用它可以完成如下任务:
  方便的使用Ajax编写views
  通过控制器管理请求(request)及响应(response)管理国际化的应用
  使用简单的协议与模型及数据库通信
  你的Akelos应用可以在大多数共享主机服务供应方上运行,因为Akelos对服务器唯一的要求就是支持PHP。因此,Akelos PHP框架是理想的用于发布单独web应用的框架,因为它不需要非标准PHP配置便能运行。
  6. Symfony
  Symfony是一个用于开发PHP5项目的web应用框架。
  这个框架的目的在于加速web应用的开发以及维护,减少重复的编码工作。
  Symfony的系统需求不高,可以被轻易的安装在任意设置上:你只需一个Unix或Windows,搭配一个安装了PHP5的网络服务器即可。它与差不多所有的数据库兼容。Symfony的价位不高,相比主机上的花销要低得多。
  对于PHP开发者而言,使用Symfony是一件很自然的事,其学习曲线只有短短一天。干净的设计以及代码可读性将缩短开发时间。开发者可以将敏捷开发的原理(如DRY,KISS或XP等)应用在其中,将重点放在应用逻辑层面上,而不用花费大量时间在编写没完没了的XML配置文件上。
  Symfony旨在建立企业级的完善应用程序。也就是说,你拥有整个设置的控制权:从路径结构到外部库,几乎一切都可以自定义。为了符合企业的开发条例,Symfony还绑定了一些额外的工具,以便于项目的测试,调试以及归档。
  7. Prado
  PRADO团队由一些PRADO狂热者组成,这些成员开发并推动PRADO框架以及相关项目的进行。
  PRADO的灵感起源于Apache Tapestry。从04年开始,PRADO成为SourceForge上的开源项目之一。这个项目目前进展到了3.x版本。
  8. Zend
  作为PHP艺术及精神的延伸,Zend框架的基础在于简单,面向对象的最佳方法,方便企业的许可协议,以及经过反复测试的快速代码库。Zend框架旨在建造更安全,更可靠的Web 2.0应用及web服务,并不断从前沿厂商(如Google,Amazon,Yahoo,Flickr,StrikeIron和ProgrammableWeb等)的API那里吸收精华。
  9. ZooP
  Zoop PHP框架,意为Zoop面向对象的PHP框架。
  这是个稳定,可伸缩并可移植的框架。从诞生到现在的5年间,已经在不少产品开发中被使用。Zoop是一个快速,有效并干净的框架。它的伸缩性很好,你可以只安装你需要的功能。
  对代码并不很熟悉的开发者也可以通过Zoop快速的开发安全的web应用。熟练的开发者则可以更加将Zoop的弹性利用到极致。
  Zoop建议将display,logic以及数据层(MVC)分开使用。
  Zoop由很多组件和项目集合而成,其中包括smarty和prototype AJAX框架,PEAR模块等。高效的核心组件提供了很多你原本需要自己编码来实现的功能。Zoop内置的纠错功能可以通过配置实现生产环境下的错误日志生成,这个错误日志提供了很多信息,可读性很高,可以更轻易的寻找并排除错误。
  Zoop的一个特别之处在于其GuiControls,在PHP中是一个相当革新的想法。它提供了很多form widgets与验证完整的集合到一起,并形成了一个可以轻松打造个性化GuiControls的框架。
  10. QPHP
  QPHP,意为快速PHP,它是一个与ASP.NET类似的MVC框架。基本上它是这样一个情况:
  整合了Java和C#的美感
  除去了在其他PHP框架中使用的Perl形式的意义含糊的语言大量基于OOP的概念
 
  利用PHP的OOP特性实现数据保护
  本文将向您介绍在声明类变量时,利用访问修饰符private、protected和public,保护数据和限制数据对象的可见性,在PHP 5中,这些概念也可用于其他的数据类,保护其重要的内部数据。
  在PHP 4中,声明变量通常使用var,而在PHP 5中,可使用面向对象编程(OOP)的特性来自定义数据的可见性--即可访问性,可见性在此与变量作用域非常类似,但提供了更好的控制机制,有以下三种类型的可见性修饰符:
  Public(默认)--变量可在全局范围内访问或修改。
  Protected--变量只能在类本身及直接派生(使用extends语句)类内访问或修改。
  Private--变量只能在类内部访问或修改。
  与接口实现类似,在程序中违反这些规则将会导致严重的错误;且与接口类似的是,它们的存在纯粹是为了方便程序员。但这并不意味着可以忽略它们,指定某个类成员变量的可见性,可保护对象内的数据免受外界影响。
  假设有一个MySqlDB类,一个$link变量在其中声明为private,这意味着这个变量只能从对象内部使用$this变量访问,这防止了类外其他对象或函数的意外覆盖,在此,我们将使用可见性特性帮助我们创建一个query对象。
  你可以把query当作一个单独的实体,它可以执行,并且返回结果。一些数据库系统也具有存储过程,存储过程与函数很相似,它们存储查询语句,并在调用时接受相应的参数,但MySQL在5.1版本之前并没有提供类似功能,某些其他类型的数据库管理系统也没有。
  在本文中,将把上述两个特性结合进示例的query对象中,示例将模拟一个基本的存储过程,并在内部保存结果指针。目前,重点是从对象中执行query,在此可以调用MySqlDB对象的query()函数。
  可在query对象中定义如下的public函数:
  __construct()--构造函数接受一个包含了实现DB接口对象实例引用的参数。
  prepare()--函数prepare()初始化query的存储过程。它可能包含一个或多个有限的占位符,而其将会作为参数传递给execute()函数。占位符定义为与参数个数有关的一个冒号紧跟一个整数及与参数类型有关的一个字母。
  包含占位符的一个简单的query看起来像以下这样:
  SELECT col1,col2 FROM table_name WHERE col1=:1Iexecute()--函数execute()将执行query。如果它被prepare()函数过早地初始化为一个存储过程,任何传递进来的参数都会被作为存储过程的执行参数,否则,第一个参数只会被作为查询文本。函数execute()将返回执行查询后的结果。
  compile()--函数compile()与函数execute()类似,实际上,query并没有执行,而是替换查询字符串中所有占位符,接受存储过程的参数,并返回query的编译版本。
  受保护的成员
  正如上面所提到的,可见性的概念可用于隐藏对象的内部工作,保护内部工作所需的数据完整性。前面已经解释,query返回的结果指针将会保存为protected属性,在此使用保护成员是因为从query对象派生出来的特定数据库query对象可能会重载某些核心功能。
  深掘代码
  理论说够了,现在开始编写代码,首先,创建一个例1所示的模板:
  例1:数据库query类的一个模板
  class DBQuery
  {
  /**
  *保存一个实现了DB接口对象的引用。
  */
  protected $db;
  /**
  *如果是一个存储过程,设为true。
  */
  protected $stored_procedure = false;
  /**
  *保存一个删除了所有字符串的query。
  */
  private $query;
  /**
  *用于在SQL中匹配引号。
  */
  private static $QUOTE_MATCH = "/(".*(?db = $db;}
  public function prepare($query)
  {
  $this->stored_procedure = true;
  }
  public function compile($args)
  {}
  public function execute($query)
  {}
  }
 

上一篇:使用PHP与XML进行网站编程

下一篇:38条PHP编码优化加速技巧