欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-20 16:03:58
date.csv:"id" "name" "email""1" "小明" "xm@163.com""2" "小东" "xd@sina.com""3" "小少" "shaoz...

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字节,大功告成。

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