如何在PHP中导出CSV文件,字符集为UTF-8而非带BOM的UTF-8?

4
我可以使用以下代码从PHP导出CSV文件:

可能是重复问题:
使用BOM在PHP中将字符串编码为UTF-8

我可以使用以下代码从PHP导出CSV文件:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');

$output = fopen('php://output', 'w');

但是这段代码创建的文件使用的字符集为 utf-8 without BOM,但我需要使用字符集为 utf-8
有没有解决这个问题的方法?

你是指cvs还是csv还是两者都包括? - Jukka K. Korpela
不好意思,文件类型是CSV。 - aya
为什么需要BOM?据我所知,在Unicode中不建议包含字节顺序标记。 - Daniel
@Daniel 我也遇到了一个Unicode CSV文件的问题 - 它在任何文本编辑器中都可以正常打开,但是当BOM不存在时,老实可靠的Excel会出错(至少在我的机器上)。也许我还做错了其他事情! - OrganicPanda
@OrganicPanda 这是因为微软办公产品默认使用Windows操作系统的默认设置(在瑞典大概是iso-8859-1之类的),并且甚至不尝试检测文件编码。根据我的经验,办公套件中所有的Windows产品都存在一些严重的兼容性问题。我不知道自己花了多少时间仅仅是为了让客户的导出和其他文档正常工作。这很可怕,因为办公套件被专业企业广泛使用。 - Daniel
1
@Daniel 谢谢你的解释。我需要支持这些疯狂的应用程序,所以我将继续使用BOM,并希望它不会在其他未预料到的应用程序中引起问题! - OrganicPanda
1个回答

15

以下是我是如何做到的。

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=file.csv'));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

当然,您可以用您需要的内容替换echo $csv_file_content


谢谢老兄,你帮了我大忙。通过使用那些\xEF\xBB\xBF字符,我知道这样会起作用。但我不知道如何实现它。你让我的一天过得很愉快。 - Pavan Kumar
1
以防其他人使用此解决方案,此代码中的行header('Content-Disposition: attachment; filename=file.csv'));多了一个),应该是:header('Content-Disposition: attachment; filename=file.csv'); - webbm

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