首页 > 编程语言 >PHP中文乱码解决

PHP中文乱码解决

时间:2023-02-07 13:02:16浏览次数:63  
标签:Content 中文 文件名 filename 乱码 header attachment Disposition 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!" ;

?>




 

这样用浏览器打开之后,就可以下载document.txt。

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。比如把上面那个程序稍稍改一下:

<?php
$filename = "中文 文件名.txt" ;
header ( 'Content-Type: application/octet-stream' ) ;
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'%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文件名>”

Opera9           attachment; filename=”UTF-8文件名”

Safari3(Win)    貌似不支持?上述方法都不行

这样看来,程序必须得这样写才能支持所有主流浏览器:

以下代码适用于页面时UTF-8编码情况,若不是,用iconv将文件名转码下

<?php
$filename = "中文 文件名.txt" ;
$encoded_filename = urlencode ( $filename ) ;
$encoded_filename = str_replace ( "+" , "%20" , $encoded_filename ) ;
$ua = $_SERVER [ "HTTP_USER_AGENT" ] ;
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


 

标签:Content,中文,文件名,filename,乱码,header,attachment,Disposition,PHP
From: https://blog.51cto.com/peishuai/6042005

相关文章

  • PHP安全笔记
    1、          MagicQuotes选项PHP.INI中中有三个以magic_quotes_开头的选项magic_quotes_gpc如果是On的话,就会自动用‘\’转义从GET,POST,COOKIE来的数据,这是为......
  • 17个非常有用的PHP类和库
    本文转自互联网。在我们日常程序开发当中,使用一个好的而且成熟的PHP类,可以减少很多手工编码,通过这些通用API的使用,可以大大减轻我们的开发工作。今天,我们将重点介绍了一些很......
  • PHP字符串函数、知识要点总结
    主要包括以下方面:字符串的格式化字符串的连接与分割字符串的比较使用字符串函数匹配和替换子字符串使用正则表达式(下一篇文章专门总结)1、字符串的格式化:chop(rtrim)、ltrim......
  • 数据采集必备知识-php计划任务的实现
    站点如果做的多了,难免要发些伪原创的文章,文章的来源必然来源于网络采集,对于采集这里不详述,我自己用的是”SimpleHTMLDOM”,见我另一篇关于他的介绍:​​数据采集利器-PHP用......
  • PHP获取IP的多种方式解析
    PHP获取IP的方法有许多种,我们今天向大家总结了六种方法,希望通过对这六种方法的学习,能够加深我们对PHP语言的进一步了解,巩固我们所掌握的知识。PHP获取IP方法一:<?phpecho"<......
  • 将本地Excel文件压缩为zip返回下载(解决压缩文件名乱码)
    StringzipPath=basePath+File.separator+"ZIP"+File.separator;Filezip=newFile(basePath+File.separator+"ZIP"+File.separator+fileName+Time+".zip");......
  • python打印中文
    python3中将json.dumps()结果显示为中文解决json.dumps()这个方法是没有encoding这个参数的,要想将默认的ascii字符改为中文,应该将ensure_asciii设为Falseprint(json.du......
  • PHPMyWind支持ppt粘贴
    ​ 自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了。一般情况下我们将Word内容粘贴到Web编辑......
  • laravel框架php artisan vendor:publish的作用
     场景在使用laravel框架的时候phpartisanvendor:publish#可以把对应的服务提供者的资源文件,复制到指定的路径下。 一般用法phpartisanvendor:publish--pr......
  • 学编程PHP与Python都有哪些区别?
    对于学习编程的小伙伴来说,不管是PHP还是python或者是java都是一门不错的编程语言,根据不同的应用场景选择适合的语言编程至关重要。那么学编程用PHP与Python语言都有哪些区......