fgetcsv和fputcsv支持一个$escape参数,然而,它要么被破坏,要么我不理解它应该如何工作.忽略这样一个事实,即您没有看到记录的$escape参数fputcsv,它在PHP源代码中受支持,有一个小错误阻止它在文档中出现.
该函数还支持$delimiter和$enclosure参数,分别默认为逗号和双引号.我希望$escape传递参数是为了让一个字段包含任何一个元字符(反斜杠,逗号或双引号),但事实并非如此.(我现在从阅读维基百科了解到,这些都用双引号括起来).
例如,fgetcsv文档中评论部分中影响众多海报的陷阱.我们想要在字段中写一个反斜杠的情况.
$r = fopen('/tmp/test.csv', 'w');
fwrite($r, '"\"');
fclose($r);
$r = fopen('/tmp/test.csv', 'r');
var_dump(fgetcsv($r));
fclose($r);
Run Code Online (Sandbox Code Playgroud)
这回来了false.我也尝试过"\\",但是也会回来false.用一些含糊不清的文本填充反斜杠会fgetcsv得到它需要的提升...... "hi\\there"并且"hi\there"解析并得到相同的结果,但结果只有1个反斜杠,那么究竟是什么意思$escape呢?
我没有在双引号中包含反斜杠时观察到相同的行为.编写包含字符串的'CSV'文件\,并\\在解析时得到相同的结果fgetcsv,1反斜杠.
让我们问一下PHP如何将反斜杠编码为CSV中的字段 fputcsv
$r = fopen('/tmp/test.csv', 'w');
fputcsv($r, array('\\'));
fclose($r);
echo file_get_contents('/tmp/test.csv');
Run Code Online (Sandbox Code Playgroud)
结果是一个双引号封闭的单反斜杠(我已经尝试了3个版本的PHP> 5.5.4,当$enclose支持被添加到fputcsv)时.这个的欢闹是fgetcsv根据我上面的笔记甚至无法正确阅读它,它会返回 …
PHP 中的 fputcsv() 和 fgetcsv() 似乎存在编码问题或错误。
以下 PHP 代码:
$row_before = ['A', json_encode(['a', '\\', 'b']), 'B'];
print "\nBEFORE:\n";
var_export($row_before);
print "\n";
$fh = fopen($file = 'php://temp', 'rb+');
fputcsv($fh, $row_before);
rewind($fh);
$row_after = fgetcsv($fh);
print "\nAFTER:\n";
var_export($row_after);
print "\n\n";
fclose($fh);
Run Code Online (Sandbox Code Playgroud)
给我这个输出:
BEFORE:
array (
0 => 'A',
1 => '["a","\\\\","b"]',
2 => 'B',
)
AFTER:
array (
0 => 'A',
1 => '["a","\\\\',
2 => 'b""]"',
3 => 'B',
)
Run Code Online (Sandbox Code Playgroud)
很明显,数据在途中被损坏。最初该行只有 3 个单元格,后来该行有 4 个单元格。由于反斜杠也用作转义字符,中间的单元格被分割。
另请参阅 https://3v4l.org/nc1oE 或者此处,使用分隔符、封装、escape_char 的显式值: https: //3v4l.org/Svt7m …