我有一个非常简单的东西,它只是输出一些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,但我不知道如何做到这一点。正如你所看到的,我只是回显这些数据,我没有写入任何文件。如果我需要,我可以这样做,我只是没有因为在这一点上似乎不需要这样做。任何帮助吗?

更新:我尝试将BOM作为回显包(“CCC”,0xef, 0xbb, 0xbf);这是我刚刚从一个试图检测BOM的网站上找到的。但Excel只是在导入时将这三个字符附加到第一个单元格,仍然会把特殊字符弄乱。


当前回答

你可以在导出之前将3个字节附加到文件中,这对我来说是有效的。在此之前,该系统只能在Windows和HP -UX中工作,但在Linux中失败。

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

有一个UTF-8 BOM(3字节,十六进制EF BB BF)在文件的开始。否则Excel将根据本地默认编码(例如cp1252)而不是utf-8来解释数据

为Excel生成CSV文件,如何在值中有换行符

其他回答

我只是尝试了这些头文件,并在Windows 7 PC上安装了Excel 2013,以正确导入带有特殊字符的CSV文件。字节顺序标记(Byte Order Mark, BOM)是使它工作的最后一个键。


    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header("Content-disposition: attachment; filename=filename.csv");
    header("Pragma: public");
    header("Expires: 0");
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

引用微软技术支持工程师的话,

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字节顺序标记 科(255)。科(254)

下一个问题只出现在Excel在OS X(但不是Windows)将是当查看一个以逗号分隔值的CSV文件时,Excel将只呈现一行的行,所有的文本与第一行的逗号一起。

避免这种情况的方法是使用制表符作为分离的值。

我从PHP注释中使用了这个函数(使用制表符“\t”而不是逗号),它在OS X和Windows Excel上完美地工作。

注意,要修复一个空列作为一行结束的问题,我必须改变代码行,它说:

    $field_cnt = count($fields);

to

    $field_cnt = count($fields)-1;

正如本页上的其他一些评论所说,其他电子表格应用程序,如OpenOffice Calc,苹果自己的Numbers和谷歌Doc的spreadsheet,对带有逗号的UTF-8文件没有任何问题。

请参阅此问题中的表格,了解在Excel中哪些适用于Unicode CSV文件,哪些不适用


作为旁注,我可能会补充一点,如果你正在使用Composer,你应该看看如何将League\Csv添加到你的需求中。League\Csv有一个非常好的API来构建Csv文件。

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

在我的情况下,以下工作非常好,使UTF-8字符的CSV文件在Excel中正确显示。

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

0xEF 0xBB 0xBF BOM头将让Excel知道正确的编码。

我也有同样(或类似)的问题。

在我的情况下,如果我添加一个BOM输出,它工作:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

我相信这是一个非常丑陋的黑客,但它对我有效,至少对Excel 2007 Windows有效。不确定在Mac上能不能用。

这是我的工作。

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