小编典典

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

php

我有一个非常简单的东西,它只能以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在导入时只是将这三个字符附加到第一个单元格,并且仍然弄乱了特殊字符。


阅读 361

收藏
2020-05-26

共1个答案

小编典典

引用Microsoft支持工程师的话

Excel for Mac当前不支持UTF-8

2017年更新 :适用于 Office 2016 之前的Mac的所有Microsoft Excel版本。较新版本(来自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文件没有问题。

2020-05-26