我有一个非常简单的东西,它只是以 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输入这些数据,我没有写任何文件。如果需要,我可以这样做,我只是不是因为在这一点上似乎不需要它。有什么帮助吗?
echo
更新:我尝试回显echo pack("CCC", 0xef, 0xbb, 0xbf);刚刚从试图检测 BOM 的站点中提取的 BOM。但是 Excel 只是在导入时将这三个字符附加到第一个单元格,并且仍然弄乱了特殊字符。
echo pack("CCC", 0xef, 0xbb, 0xbf);
引用Microsoft 支持工程师的话,
Excel for Mac 目前不支持 UTF-8
2017 年更新: Office 2016 之前的所有 Microsoft Excel for Mac 版本都是如此。较新的版本(来自 Office 365)现在支持 UTF-8。
为了输出 Windows 和 OS X 上的 Excel 都能成功读取的 UTF-8 内容,您需要做两件事:
确保将 UTF-8 CSV 文本转换为 UTF-16LE
mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
确保将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到您的需求中。League\Csv有一个非常好的 API 用于构建 CSV 文件。
League\Csv
要使用League\Csv这种创建 CSV 文件的方法,请查看此示例