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

新手上路,请多包涵

我有一个非常简单的东西,它只是以 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 回显为 echo pack("CCC", 0xef, 0xbb, 0xbf); 我刚刚从试图检测 BOM 的站点中提取。但是 Excel 只是在导入时将这三个字符附加到第一个单元格,并且仍然弄乱了特殊字符。

原文由 Ben Saufley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 385
2 个回答

引用 Microsoft 支持工程师的 话,

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');

  1. 确保将 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 与这种创建 CSV 文件的方法,请查看 此示例

原文由 Tim Groeneveld 发布,翻译遵循 CC BY-SA 4.0 许可协议

这对我有用。

 $df = fopen("File.csv", "w");
header('Content-Encoding: UTF-8');
header("Content-type: text/csv charset=UTF-8");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Location: Path/File.csv');
header('Content-Transfer-Encoding: binary');
header("Pragma: no-cache");
header("Expires: 0");
fputs($df, $bom = ( chr(0xEF) . chr(0xBB) . chr(0xBF) ));

原文由 WSPF Sit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题