php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法


Posted in PHP onAugust 10, 2013

date.csv:
"ID" "NAME" "EMAIL"
"1" "小明" "xm@163.com"
"2" "小东" "xd@sina.com"
"3" "小少" "shaozi@hotmai.com"

读取这个csv文件

<?php
$handle=fopen('date.csv','r');
while($data=fgetcsv($handle,10000,"/t"))   
{   
  echo "$data[0]"."$data[1]"."$data[2]";   
}
?>

读取后在页面上显示时,成了这样:
"ID" NAME EMAIL
 1 小明 xm@163.com
 2 小东 xd@sina.com
 3 小少 shaozi@hotmai.com
fgetcsv函数的字段环绕符默认是双引号,
为什么我读取出来时,其它字段都好好的,可是ID还有双引号包着?

上网查了下,原来是utf8编码的bom在php下无法识别.
下面是查来的资料:
Unicode规范中有一个BOM的概念。BOM——Byte Order Mark,就是字节序标记。在
这里
找到一段关于BOM的说明:
在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

另外unicode网站的
FAQ-BOM
详细介绍了BOM。官方的自然权威,不过是英文的,看起来比较费劲。
UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可是,还是有很多软件不能识别BOM。我在研究Firefox的时候就知道,在Firefox早期的版本里,扩展是不能有BOM的,不过Firefox 1.5以后的版本已经开始支持BOM了。现在又发现,PHP也不支持BOM。

PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在转换->UTF-8转ASCII,或者在另存为里选择ASCII编码。如果是DOS格式的行尾符,可以用记事本打开,点另存为,选ASCII编码。如果包含中文字符的话,可以用UE的另存为功能,选择“UTF-8 无 BOM”即可。请参考下面的图片:
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法

根据Bo-Blog的wiki的说明:Editplus需要先另存为gb,再另存为UTF-8。不过这样做要小心,所有GBK编码中不包含的字符就会都丢了。如果有一些非中文的字符在文件里的话还是不要用这种办法了。(从这一个小方面来看,UE——UltraEdite-32确实比Editplus好很多,Editplus太轻量级了)

另外我发现了一个办法,就是利用Wordpress提供的文件编辑器。这个办法不受限制,不需要去下载专门的编辑器,毕竟大家都在用Wordpress嘛。先在ftp里把要编辑的文件的写入权限打开,然后进入Wordpress后台->管理->文件编辑器,输入要编辑文件的路径,点编辑文件。在显示出来的编辑界面中,你是看不到开头的那三个字符的,不过没关系,把光标定位在整个文件的第一个字符前,按一下Backspace键。OK了,点更新文件吧,在ftp里刷新一下,可以看到文件小了3字节,大功告成。

最后说一下,这是个大问题,所有要自己写插件的,编辑别人的插件自己用的,需要修改模版的(这条估计每个人都需要吧),最好了解一下上面的知识,免得出现问题时不知所措。

PHP 相关文章推荐
PHP截取中文字符串的问题
Jul 12 PHP
PHP网站开发中常用的8个小技巧
Feb 13 PHP
php编写的一个E-mail验证类
Mar 25 PHP
PHP date函数常用时间处理方法
May 11 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
php 常用的系统函数
Feb 07 PHP
php实例化一个类的具体方法
Sep 19 PHP
phpQuery采集网页实现代码实例
Apr 02 PHP
PHP实现简易用户登录系统
Jul 10 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 PHP
浅析php中常量,变量的作用域和生存周期
Aug 10 #PHP
浅析linux下apache服务器的配置和管理
Aug 10 #PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 #PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 #PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 #PHP
php一些错误处理的方法与技巧总结
Aug 10 #PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 #PHP
You might like
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
咖啡与水的关系
2021/03/03 冲泡冲煮
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
php数组随机排序实现方法
2015/06/13 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
php构造函数与析构函数
2016/04/23 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
原生JS实现相邻月份日历
2020/10/13 Javascript
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
pytorch permute维度转换方法
2018/12/14 Python
python pandas生成时间列表
2019/06/29 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
授权委托书
2014/07/31 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript