当前位置: 首页 > 面试题库 >

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

白和泽
2023-03-14
问题内容

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


问题答案:

引用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文件没有问题。



 类似资料:
  • 我有一个耗时的任务,我想在用户输入“abort”时手动中止它。 可运行:

  • 问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。

  • 问题内容: 当使用Express for Node.js时,我注意到它输出的HTML代码没有换行符或制表符。尽管下载可能更有效,但在开发过程中可读性不强。 如何获得Express以输出格式正确的HTML? 问题答案: 在您的主要位置或所在位置: 快递4.x 快递3.x 快递2.x 我输入漂亮的字样是因为您希望通过使用“丑陋”来提高效率。在生产中进行部署时,请确保设置环境变量。可以使用您在的“脚本”

  • 今天项目下载了一个json2csv的模块,但是引入的时候模块解析失败,查了一下是要配置webpack的loader模块,但是试了半天也没配出来,请问这个地方应该怎样配置一下才可以吗? 用的是node14 配置了一下webpack,但是也不太确定有什么用

  • 问题内容: 我有一个Java应用程序,该应用程序存在一些性能问题,有人建议我以verbose:gc模式运行它。这已经完成,但是我不知道如何解释日志记录。是否可以向我解释这一切的含义,或者为我提供提高性能的建议? 可以在以下位置找到输出日志:http : //pastebin.com/uDNPEGcd 在此先感谢您,马尔滕 问题答案: 在每个gc集合之后立即打印,并打印有关每个世代内存详细信息的详细