看了用fgets的方法来代替fgetcsv读取csv文件,后来发现,一旦不使经过处理而直接代替,还是有问题:着实让我郁闷了很久啊。
首先,fgetcsv在处理的时候,会正确的处理一行中的内容,就算我行中含有换行符和,,都可以处理掉,正确的解析出来。而一旦用fgets,那么这些都需要自己做,当然网上也给出了一个重写fgetcsv的方法,当然用的使正则,这个效率上需要斟酌啊。
但是fgetcsv却有个问题,就如我上一篇中提到的,地区的设置,当然setlocale(LC_ALL, 'zh_CN');事实证明是可以解决的,但是这个是在我WIN下测试的情况下。当我转移到Ubuntu来测试的时候,悲剧发生了。
虽然我的ubuntu系统使中文的系统,可是用的local是zh_CN.UTF8的,并没有zh_CN.GBK的,于是乎,中文字不能解析的情景再次上演了。
当然前辈的肩膀总是伟大的,在互联网的推动下,一切都有办法解决。
我先是更新了下语言包,系统->管理->语言支持。第一次打开的时候提示我没有安装完全,需要升级,于是我升级了,可是在命令行中查看locale -a的时候,仍然没有zh_CN:
www@ubuntu:/usr/www/GBKHost/test$ locale -a
C
POSIX
zh_CN.utf8
zh_HK.utf8
zh_SG.utf8
zh_TW.utf8
于是我这样做:
1、修改local文件,添加zh_CN支持:
sudo vi /var/lib/locales/supported.d/local
在第一行前插入一行zh_CN 为了一旦,我也插入了zh_CN.GBK GBK这行
保存。
2、设置支持包
sudo locale-gen zh_CN
sudo locale-gen zh_CN.GBK
3、 再次运行locale -a
www@ubuntu:/usr/www/GBKHost/test$ locale -a
C
POSIX
zh_CN
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK.utf8
zh_SG.utf8
zh_TW.utf8
终于有了。
再次去运行下csv导入页面(当然含有setlocale(LC_CTYPE, 'zh_CN')操作了),成功!
fgetcsv函数的“陷阱”
今天遇到一个奇怪的问题,前几天写的一个PHP解析CSV文件格式的代码,在本地运行正常,到了测试站上,就感觉像泄了气的球一样,不顶用了,并且只要是中文输入,总是不能正确读取,开始的时候怀疑是版本问题,因为本地装的是5.3的最新版,所以总是有所怀疑,可是看了手册,却推翻了我的这个问题。正纠结着,并且一旦说无论输入什么都不能解析么,那也就罢了,奇就奇在,我第一行的中文他解析没有问题,第二行开始
的所有中文,他都解析不了,读取出来的都是空字串。也排除了我怀疑的编码问题。
后来在手册中找到如下一句话
1: Note: 2: 3: Locale setting is taken into account by this function. If LANG is e.g. en_US.UTF-8, files in one-byte encoding are read wrong by this function.
然后google了下fgetcsv,才发现,原来确实是这样,fgetcsv函数对区域的设置是敏感的,对于单字节编码的文件读取时会出现错误。在网上也看到类是可行的解决方案:在执行之前先设置setlocale();地区信息。不过没验证该方法的可行度。
最后是用fget来代替该方法。
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。