我有一个非常简单的东西,它只是输出一些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文件,如何在值中有换行符

其他回答

你可以转换你的CSV字符串与iconv。 例如:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );

接下来:

问题似乎只是Mac上的Excel。这不是我生成文件的方式,因为即使从Excel生成csv也会破坏它们。我保存为CSV,然后重新导入,所有的字符都乱成一团。

所以,这个问题似乎没有正确答案。谢谢你的建议。

我想说,从我所读到的,@Daniel Magliola关于BOM的建议可能是其他计算机的最佳答案。但这还是解决不了我的问题。

当我调查时,我发现UTF-8在MAC和Windows上工作得不好,所以我尝试了Windows-1252,它在两者上都支持得很好,但你必须在ubuntu上选择编码类型。 下面是我的代码$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

我在Mac上,在我的情况下,我只需要用“sep=;\n”指定分隔符,并像这样用UTF-16LE编码文件:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

你可以在导出之前将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文件,如何在值中有换行符