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 方便水印和缩略图的图形类
May 21 PHP
php foreach、while性能比较
Oct 15 PHP
PHP 编写大型网站问题集
May 07 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 PHP
Opcache导致php-fpm崩溃nginx返回502
Mar 02 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
Sep 17 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
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
php5 mysql分页实例代码
2008/04/10 PHP
PHP5 字符串处理函数大全
2010/03/23 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
js null undefined 空区别说明
2010/06/13 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
中学门卫岗位职责
2013/12/26 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
会议室标语
2014/06/21 职场文书
公司租房协议书
2014/10/14 职场文书
党员转正申请报告
2015/05/15 职场文书
机关工会工作总结2015
2015/05/26 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL