我有一个非常简单的东西,它只是输出一些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');

其他回答

不需要使用mb_convert_encoding转换已经经过utf-8编码的文本。只需要在原来的内容前面加上三个字:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

对我来说,这解决了csv文件中特殊字符的问题。

下面是我怎么做的(这是提示浏览器下载csv文件):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

唯一的一件事,它修复了UTF8编码问题在CSV预览当你在Mac上按空格键。但不是在Excel Mac 2008…不知道为什么

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

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

当我有一个导入数据的Excel VBA例程时,我也遇到了同样的问题。由于CSV是纯文本格式,我通过编程方式在简单的文件编辑器(如写字板)中打开数据,并将其重新保存为unicode文本,或者从那里将其复制到剪贴板并粘贴到Excel中来解决这个问题。如果excel不能自动地将CSV解析为单元格,可以使用内置的“文本到列”功能轻松地进行补救。

因为UTF8编码不适合Excel。可以使用iconv()将数据转换为另一种编码类型。

e.g.

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),