使用PHP中的fputcsv将UTF-8字符写入文件

59

我想尝试在PHP中将波斯语字符写入CSV文件,我正在使用fputcsv函数,但是如何使用fputcsv写UTF-8字符到CSV文件中呢?

我的代码部分:

$df = fopen($filepath, 'w');
fputcsv($df, array($coupon->code, $discount->label));
4个回答

201

试试这个:

$df = fopen($filepath, 'w');
fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($df, array($coupon->code, $discount->label));

这行代码 fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF)); 可以写入文件头,确保编码正确。


1
你还需要考虑Excel的角度。确保Excel已经编码为UTF-8。 - Faris Rayhan
4
请解释一下这三个字符是什么,它们在修复UTF8问题中的目的是什么?请用通俗易懂的语言进行翻译,但不要改变原意。 - Ahmad Baktash Hayeri
2
@AhmadBaktashHayeri 这些字节组成了 UTF-8 的字节顺序标记(BOM)。 - Herbert Van-Vliet
这个很好用,但是在我的情况下,它会导致某些字段无法打印到Excel文件中。有什么想法是为什么吗? - rutex
另请参阅 https://dev59.com/jZzha4cB1Zd3GeqPCUET 的答案 - 如果这不起作用,还需要在输出之前打印字符。 - softfrog

37

也试试这个:

$df = fopen($filepath, 'w');
$array = array($coupon->code, $discount->label);
$array = array_map("utf8_decode", $array);
fputcsv($df, $array);

1
这个答案是做什么的? - mwfearnley
3
这将把你的UTF8字符串解码为单字节ISO-8859-1。这不是OP所要求的。 - Solrac
@FarisRayhan 我这里也一样.. :( - Chinmay235
在我看来,这更清晰,并且由 utf8_decode 执行工作,不需要读者遵守 BOM。 - Ross

8
如果您想为Excel创建一个UTF-8文件,请使用以下简单解决方案:
$fp = fopen($filename, 'w');

//add BOM to fix UTF-8 in Excel 
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));

请参见官方PHP页面上此处的原始答案。

1

和其他人类似,但对我有效

fputs($output_file, chr(0xEF) . chr(0xBB) . chr(0xBF) );

在使用fputcsv函数处理数据之前


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接