1 回答
TA贡献1848条经验 获得超10个赞
PHP手册指出
如果一个字段中包含一个封闭字符,它将通过加倍来转义,除非它前面紧跟一个escape_char。
这就是你的情况!你使用fputcsv
它的默认参数,"
作为外壳和\
作为escape_char,所以函数离开了\"
,没有把它变成\""
###怎么修 ?如果您使用的是 PHP >= 7.4.0,那么只需禁用专有转义机制。通过在escape_char参数中提供一个空字符串
fputcsv( $fh, $row, ',', '"' , '');
如果您在 7.4.0 之前,那么搜索已向我展示了此解决方法:"\0"
作为 escape_char 参数传递。(我测试了它,它适用于你的例子)
fputcsv( $fh, $row, ',', '"' , "\0");
根据我的搜索,这是针对此问题的广泛使用的hack,但是 Christoph M. Becker 在他的提案“杀死 CSV 转义”中表示 (看起来您不是唯一一个对fputcsv
CSV 转义感到愤怒的人:D)
虽然在许多情况下将“\0”作为 $escape 参数传递将产生所需的结果,但如果有人正在写入/读取二进制 CSV 文件,这将不起作用,可能会遇到一些非 ASCII 兼容编码的问题,并且通常被视为作为黑客。
###标准呢?
关于 CSV 文件的RFC 4180已经声明
如果使用双引号将字段括起来,则出现在字段内的双引号必须通过在其前面加上另一个双引号来转义
在标准 CSV 中没有什么叫做转义的!!只是一个双引号作为外壳,如果它出现在带有另一个双引号的字符串中,则将其转义。可能是 PHP 想要支持非标准的 CSV 文件,我不知道!
经过一些搜索和测试,事实证明这是 CSV 文件 PHP 函数fgetcsv
和fputcsv
.
- 1 回答
- 0 关注
- 209 浏览
添加回答
举报