PHP7.0.1下的csv解析bug

来源:互联网 发布:芈月传 大秦帝国 知乎 编辑:程序博客网 时间:2024/04/25 07:34

php中有几个处理csv的函数,fgetcsv($fp)用于从一个文件句柄中读取一条csv记录,并解析成数组,每个元素对应一个字段;fputcsv($fp, $arr)把整个数组转换成一条csv记录,数组的元素对应csv记录中的字段,写入文件中;还有个函数str_getcsv($str),是把一个具有csv格式的字符串解析成数组。

最近工作中需要处理csv格式的文件,生成csv,解析csv。遇到的一个问题困扰了我好几天,好好的csv文件,也是用fputcsv函数生成的,用fgetcsv或者str_getcsv解析时,竟然多出好多字段!

代码如下:

$str = '周一,星期一,Monday,测试地,123456';$fields = str_getcsv($str);print_r(array_map(function($v){    // 为了在控制台中正常显示中文,特意转换编码    return iconv("UTF-8", "GBK", $v);}, $fields));
  • 代码一律以utf8格式保存。

不同版本php的输出如下:
这里写图片描述

其中php70n是php7.0.1,可以看到php5.5都没有问题,可以正常解析上面的csv字符串,php7.0.1把后面的“测试地”与“123456”解析为一个字段了。

测试发现一般遇到以某些汉字结尾的字段会出现这种情况,奇数个汉字和偶数个汉字也会有区别,比如:

$str = '周一,星期一,测试,Monday,试,abc,测试地,123456';

会被解析为:

这里写图片描述

“测试”两个字解析正常,但是一个“试”字就出问题了。“周一”、“星期一”都没问题。

奇怪的是这个bug在7.0.3下没有出现,目前就发现在这个版本有。

要处理这个问题,可以换个php版本,如果不方便的话,也有个笨办法,先转换成GBK编码,再用str_getcsv函数或者fgetcsv函数解析,然后把结果转换回UTF-8编码:

$str = '周一,星期一,测试,Monday,试,abc,测试地,123456';$fields = str_getcsv(iconv("UTF-8", "GBK", $str));print_r($fields);

输出:
这里写图片描述

0 0
原创粉丝点击