PHP7.0.1下的csv解析bug

转自:https://blog.csdn.net/chunyuan314/article/details/61938901

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);
输出:

 

posted @   夏秋初  阅读(487)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示