相关疑难解决方法(0)

fgetcsv/fputcsv $ escape参数从根本上打破了

概观

fgetcsvfputcsv支持一个$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 csv

10
推荐指数
1
解决办法
5331
查看次数

使用 fputcsv() / fgetcsv() 写入 csv 时数据出现乱码

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 …

php csv escaping fgetcsv fputcsv

1
推荐指数
1
解决办法
2121
查看次数

标签 统计

csv ×2

php ×2

escaping ×1

fgetcsv ×1

fputcsv ×1