小编典典

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

all

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


阅读 80

收藏
2022-06-24

共1个答案

小编典典

引用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');
    
  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到您的需求中。League\Csv一个非常好的
API 用于构建 CSV 文件

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

2022-06-24