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初学者(入门学习经验谈)
Oct 12 PHP
使用PHP求两个文件的相对路径
Jun 20 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
php 获取文件行数的方法总结
Oct 11 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
php基于协程实现异步的方法分析
Jul 17 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 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封装的HttpClient类用法实例
2015/06/17 PHP
php实现Mysql简易操作类
2015/10/11 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
python获取各操作系统硬件信息的方法
2015/06/03 Python
python利用datetime模块计算时间差
2015/08/04 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
如何利用python查找电脑文件
2018/04/27 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
python调用摄像头的示例代码
2020/09/28 Python
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
中学教师师德承诺书
2014/05/23 职场文书
2014年党建工作总结
2014/11/11 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
画展邀请函
2015/01/31 职场文书
党员身份证明材料
2015/06/19 职场文书
工作简报怎么写
2015/07/21 职场文书
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL