PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法


Posted in PHP onJanuary 04, 2016

PHP 下载文件时自动添加bom头,首先需要大家弄清楚,什么是bom头?在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order Mark)。

在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑utf-8编码后执行就会出错的原因了。

不仅限于 记事本保存的文件,只要在文件的开口包含了EF BB BF 几个不可见的字符(十六进制应该是是xEFxBBxBF,用二进制编辑文件可见)。这像是一个约定俗成的东西,当系统看到这玩意的时候,就会觉得你这个文件是UTF-8编码的。

如果你的接口是UTF-8的,你需要强制下载一个文件,比如csv.excel在默认情况(中文背景)下,认为csv是GB编码的,所以如果米有bom头,那你给用户呈现的文件,可能就是乱码了。

怎么加bom头呢?

在输出文件之前加上bom头就可以了:

代码如下:

// 文件名
 $filename = "3water.com .csv";
 header('Expires: ' . gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + 10) . ' GMT');
 header('Cache-Control: max-age=10');
 //header('Content-Type: application/vnd.ms-excel; charset=utf-8');
 header('Content-Type: text/csv; charset=utf-8');
 header("Content-Disposition: attachment; filename={$filename}");
 // 如果结果中有提示信息,则把第一行输出改为提示信息文字
 $out = "xEFxBBxBF";// 加上bom头,系统自动默认为UTF-8编码
 if (!empty($extra['notice'])) {
 $out .= "{$extra['notice']}rn";
 }
 // 输出
 foreach ($table as $row) {
 $out .= implode(",", $row) . "rn";
 }
 /* if (mb_detect_encoding()($out) == 'UTF-8') {
 $out = iconv("UTF-8//IGNORE", "GBK", $out);
 } */
 echo $out;

以下内容给大家介绍解释BOM头和去掉方法

去掉bom头的办法,简单的是下面两种:

1、editplus去BOM头的方法

编辑器调整为UTF8编码格式后,保存的文件前面会多出一串隐藏的字符(也即是BOM),用于编辑器识别这个文件是否是以UTF8编码。

运行Editplus,点击工具,选择首选项,选中文件,UTF-8标识选择 总是删除签名,然后对PHP文件编辑和保存后的PHP文件就是不带BOM的了。

2、ultraedit去除bom头办法

打开文件后,另存为选项的编码格式里选择(utf-8 无bom头),确定就ok了

怎么样,去掉bom头很简单吧

再来一段议论utf8的BOM信息的

BOM是指php文件本身的存储方式为带BOM的UTF-8,普通页面的中文乱码方式一般不是由这个原因导致的。

header("Content-type: text/html; charset=utf-8");

这句话控制html输出页面的编码方式,BOM只有在WINDOWS下采用“记事本”存储为UTF-8时才会有,这个可以用WINHEX把开始的2个字节删掉。

在dreamweaver里面编码设置里面可以设置是否带BOM,一般只要php输出的不是图片(GDI Stream),BOM都不会导致问题。

GDI Stream如果开头有了额外的 字符就会显示为 红叉。

以上内容给大家介绍了PHP 下载文件时自动添加bom头及解释BOM头和去掉方法,希望大家喜欢。

PHP 相关文章推荐
php 破解防盗链图片函数
Dec 09 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
Jul 04 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
php 获取本地IP代码
Jun 23 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
合格的PHP程序员必备技能
Nov 13 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 #PHP
PHP 读取文本文件内容并分页显示
Jan 02 #PHP
php实现概率性随机抽奖代码
Jan 02 #PHP
php实现给一张图片加上水印效果
Jan 02 #PHP
前端必学之PHP语法基础
Jan 01 #PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 #PHP
WordPress中获取指定分类及其子分类下的文章数目
Dec 31 #PHP
You might like
用穿越火线快速入门php面向对象
2012/02/22 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
PHP无限分类(树形类)
2013/09/28 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
浅谈python之新式类
2018/08/12 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
质检部岗位职责
2013/11/11 职场文书
超市重阳节活动方案
2014/02/10 职场文书
语文教学随笔感言
2014/02/18 职场文书
体育活动总结
2015/02/04 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android