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


当前回答

Excel不支持UTF-8。您必须将UTF-8文本编码为UCS-2LE。

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

其他回答

这是我的工作。

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

CSV文件必须包含字节顺序标记。

或者像建议的那样,使用HTTP正文进行回显

Add:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Or:

fprintf($file, "\xEF\xBB\xBF");

在将任何内容写入CSV文件之前。

例子:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);

EASY solution for Mac Excel 2008: I struggled with this soo many times, but here was my easy fix: Open the .csv file in Textwrangler which should open your UTF-8 chars correctly. Now in the bottom status bar change the file format from "Unicode (UTF-8)" to "Western (ISO Latin 1)" and save the file. Now go to your Mac Excel 2008 and select File > Import > Select csv > Find your file > in File origin select "Windows (ANSI)" and voila the UTF-8 chars are showing correctly. At least it does for me...

当你把它保存为txt文件,他们用逗号作为分隔符在excel中打开它时,问题还会发生吗?

问题可能根本不是编码,可能只是文件不是一个完美的CSV根据excel标准。