PHP str_getcsv解析中文CSV失败问题排查与解决建议
Laravel 6功能测试中str_getcsv解析含中文CSV失败的问题及解决办法
问题描述
在Laravel 6编写功能测试时,遇到str_getcsv函数解析含中文的CSV内容失败的问题。执行测试代码:
str_getcsv("\"未定义\",\"良品\",\"二手\",\"瑕疵\",\"良品无吊牌\"")
通过var_dump查看结果时,发现拆分异常,例如“良品,二手”被合并为单个字符串。
无效尝试
- 在
index.php中设置setlocale(LC_ALL, 'zh_CN.UTF-8')或setlocale(LC_ALL, 'zh_CN.UTF8'),该设置在API请求场景下正常生效,但在PHPUnit功能测试中无效。
解决办法
- 升级至PHP 8版本可直接解决此错误;
- 若必须使用PHP7,可设置
setlocale(LC_ALL, 'Chinese_China.65001'),此方案来自PHP官方Bug报告。
PHP版本测试结果
解析正常的版本
- PHP 8.1.8(两个编译版本)
- PHP 8.0.20
- PHP 7.2.33
解析异常的版本
- PHP 7.2.34
- PHP 7.4.30
致谢与参考
感谢@jspit和@Álvaro-gonzález的帮助,相关逻辑可参考Laravel框架中Illuminate\Validation\ValidationRuleParser.php文件的275-285行代码。
内容的提问来源于stack exchange,提问作者UioSun
相关产品推荐
相关产品推荐

