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
- PHP7.0.1下的csv解析bug
- php7下的opcache特性导致的一个bug排查
- PHPRAP1.0.1发布了,修复nginx服务器和PHP7环境下安装失败的bug,支持MOCK服务
- 一个空格引发的Bug! ----CSV输出和CSV读入
- python3.x 读取csv遇到的bug
- java解析csv的方式
- php7.0.0在windows下的安装
- php7在windows下的安装
- Unbuntu php7 下的gd2扩展安装
- CSV解析
- csv解析
- CSV解析
- 解析csv
- Excel 2007 打开 UTF-8 编码 CSV 文件的BUG
- 解析csv格式的java函数
- 解析csv格式的java函数
- 解析csv格式文件的一段C代码
- 如何解析CSV文件的示例代码
- 使用ntp服务同步时间
- 用户线程和守护线程
- ssh 免登陆配置
- 堆排序实现(Java)
- MQTT---HiveMQ源码详解(十五)Persistence-Cluster/Single
- PHP7.0.1下的csv解析bug
- spring事务隔离
- POI操作word模板并生成新的word.docx
- 【译】关键渲染路径
- 常用 Git 命令清单
- 基本的引导:用MVP构建你的Android应用架构part1
- ionic2页面回传值,关于Typescript的Promise承诺
- LeetCode : Power of Three
- 推荐系统概述