如何在PHP中输出Excel可以正确读取的UTF-8 CSV?

2022-08-30 06:20:33

我有一个非常简单的东西,它只是以CSV格式输出一些东西,但它必须是UTF-8。我在TextEdit或TextMate或Dreamweaver中打开这个文件,它正确地显示UTF-8字符,但是如果我在Excel中打开它,它就会做这种愚蠢的事情。以下是我在文档开头的内容:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

这一切似乎都有预期的效果,除了Excel(Mac,2008)不想正确导入它。Excel中没有选项可以让我“以UTF-8”打开“或任何东西,所以......我有点生气。

我似乎无法在任何地方找到任何明确的解决方案,尽管很多人都有同样的问题。我看到最多的是包含BOM,但我无法确切地弄清楚如何做到这一点。正如你在上面看到的,我只是在处理这些数据,我没有写任何文件。如果我需要,我可以这样做,我只是不是,因为在这一点上似乎不需要它。有什么帮助吗?echo

更新:我尝试回显 BOM,因为我刚刚从尝试检测 BOM 的站点中提取了 BOM。但是Excel只是在导入时将这三个字符附加到第一个单元格,并且仍然会弄乱特殊字符。echo pack("CCC", 0xef, 0xbb, 0xbf);


答案 1

我有相同(或类似)的问题。

在我的情况下,如果我向输出添加BOM,它的工作原理是:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

我相信这是一个非常丑陋的黑客攻击,但它对我有用,至少对于Excel 2007 Windows。不确定它是否适用于Mac。


答案 2

引用一位微软支持工程师的话

Excel for Mac 目前不支持 UTF-8

2017年更新在Office 2016之前的所有Microsoft Excel for Mac版本都是如此。较新版本(来自 Office 365)现在支持 UTF-8。

为了输出在Windows和OS X上的Excel能够成功读取的UTF-8内容,您需要做两件事:

  1. 确保将 UTF-8 CSV 文本转换为 UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. 确保将 UTF-16LE 字节顺序标记添加到文件的开头

    chr(255) . chr(254)
    

仅在OS X(而不是Windows)上的Excel中出现的下一个问题是,当查看具有逗号分隔值的CSV文件时,Excel将仅呈现具有一行的行,并且所有文本以及第一行中的逗号。

避免这种情况的方法是使用制表符作为分隔值。

我从PHP注释中使用了这个函数(使用选项卡“\t”而不是逗号),它在OS X和Windows Excel上完美地工作。

请注意,要解决空列作为行尾的问题,我确实必须更改代码行,该代码行显示:

    $field_cnt = count($fields);

    $field_cnt = count($fields)-1;

正如此页面上的其他一些评论所说,其他电子表格应用程序(如OpenOffice Calc,Apple自己的Numbers和Google Doc的电子表格)对带有逗号的UTF-8文件没有问题。

请参阅此问题中的表格,了解 Excel 中的 Unicode CSV 文件有效和无效的内容


作为旁注,我可能会补充一点,如果您使用的是Composer,您应该考虑将League\Csv添加到您的要求中。 有一个非常好的API用于构建CSV文件League\Csv

要使用此方法创建 CSV 文件,请查看此示例League\Csv


推荐