Laravel 11(PHP8.3)中str_getcsv用±作分隔符不拆分问题排查
问题:str_getcsv使用±作为分隔符无法拆分内容
在PHP 8.3搭配Laravel 11的应用里处理CSV内容,选了极少出现的±作为分隔符,但调用str_getcsv传入该分隔符后,内容没被拆分。代码示例:
$chunk = ['Foo±Bar±Test±±Another item']; $data = array_map(function ($row) { return str_getcsv($row, mb_strtolower('±')); }, $chunk); var_dump($data);
问题根源
str_getcsv的$delimiter参数只支持单字节字符,而±是UTF-8编码的多字节字符(占2字节),所以str_getcsv无法识别这个分隔符,自然不会拆分内容。另外,这里用mb_strtolower处理±完全没必要,这个字符没有大小写区分,处理后还是原样。
解决办法
办法1:替换为单字节分隔符后再用str_getcsv
先把±替换成单字节的符号(比如|),再用str_getcsv处理,这样能保留str_getcsv处理引号、空字段的能力:
$chunk = ['Foo±Bar±Test±±Another item']; $data = array_map(function ($row) { $processedRow = str_replace('±', '|', $row); return str_getcsv($processedRow, '|'); }, $chunk); var_dump($data);
办法2:用mb_split实现多字节拆分
如果不需要处理引号包裹的字段,可以直接用mb_split拆分多字节分隔符:
$chunk = ['Foo±Bar±Test±±Another item']; $data = array_map(function ($row) { return mb_split('±', $row); }, $chunk); var_dump($data);
进阶方案:用支持多字节的CSV库
如果CSV内容有复杂格式(比如字段带引号且包含分隔符),可以用第三方库如league/csv,它原生支持多字节分隔符,能完美处理各种CSV场景。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

