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注入实例
Oct 09 PHP
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
PHP用户验证和标签推荐的简单使用
Oct 31 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
Apr 09 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
Python制作刷网页流量工具
2017/04/23 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
接受捐赠答谢词
2014/01/27 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA