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);
输出:
地 址 :https://www.cnblogs.com/xiaqiuchu/articles/11055595.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义