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

评论

Excel没有提供调整传入文件字符集的选项?您对此有100%的把握吗?我没有复印件,所以无法尝试,但我想那儿肯定有一个下拉框。

这是Mac上的Excel-似乎比PC上的Excel更受限制。在“打开”对话框中根本没有下拉列表,除了这些下拉列表之外,还可以打开其他文件类型。我到处都看过。如果在那里,那是晦涩的。我会说98%肯定。

Microsoft Office还是Openoffice?

微软在这方面做得更好,没有办法(我发现)让OpenOffice检测字符集,甚至BOM。哎哟,

BOM对Mac的Microsoft Excel 2008也不起作用。

#1 楼

引用Microsoft支持工程师的话,


Excel for Mac当前不支持UTF-8


更新,2017年:所有人都适用Office 2016之前的Microsoft Excel for Mac版本。较新版本(来自Office 365)现在支持UTF-8。

为了输出UTF-8内容,Windows和OS X上的Excel都将要成功阅读,您需要做两件事:



请确保将UTF-8 CSV文本转换为UTF-16LE

mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');



确保将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文件没有问题。

请参阅此问题中的表格以了解有效的方法而且不适用于Excel中的Unicode CSV文件。



作为补充,我可能要补充一点,如果您使用的是Composer,则应该看看是否将League\Csv添加到您的需求中。 League\Csv具有用于构建CSV文件的非常好的API。

要使用League\Csv和这种创建CSV文件的方法一起使用,请查看此示例

评论


叫我愚蠢,但我无法完成这项工作。我使用mb_convert_encoding函数转换了数据,并在文件内容之前输出了BOM表,但是当我在Excel中打开文件时,只得到了一行汉字。我现在仍在使用逗号而不是制表符,但是大概不应该引起我的注意。

–约翰·里克斯(John Rix)
2014年8月11日22:38

@JohnRix这很奇怪。这段代码从字面上解决了我导出CSV文件时遇到的每个问题-除了仅接受逗号的进口商以外。您能给我发送您正在使用的代码的粘贴框,以及要转换为CSV的数组和导出文件的副本吗?

–蒂姆·格罗内维尔德
2014年8月12日,0:22



此解决方案还为我在Mac和Windows上解决了UTF8问题。我还发现用sep =;添加一行。或sep =,该CSV文件将告诉Excel如何分隔CSV并重新正确创建列。

–吕克·沃兰茨(Luc Wollants)
2014年11月13日14:05

我发现如果我仅以BOM表开头字符串,那么事情就会出现乱码,然后在另一行添加“ sep =,\ n”,然后在另一行添加数据。如果我在一行中完成所有操作,一切都会很好($ csv = chr(255)。chr(254)/ * BOM * /。“ sep =,\ n”。mb_convert_encoding($ csv,'UTF-16LE',' UTF-8');)。现在在Mac上一切看起来都很棒。我没有Windows可以测试。

– Tremby
2014-12-24在2:24



只有对我完全有效的东西。微软的前后矛盾使我惊叹不已。保存普通的csv文件使用“,”作为分隔符,但是如果存在BOM表,则出于某种原因使用“ \ t”保存。 .csv中的C代表“ COMMA”该死。确实并不难。

–菲尔
2015年10月20日在8:11

#2 楼

我有相同(或相似)的问题。

,如果我在输出中添加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上运行。

评论


丑陋,但超级有帮助。谢谢。

– abelito
2011-11-26 20:19



我很确定这在OS X上根本无法正常工作。我认为导入时它实际上可能显示BOM(警告:朦胧的记忆。)

– davidtbernal
2012年1月31日下午5:16

这是对的。至少,像上面的示例一样,我尝试使用BOM作为前缀,但确实确实在开始时显示了一些时髦的字符,并始终显示错误的特殊字符(在Excel 2011中进行了测试)。在所有设置下,这似乎最适合我:stackoverflow.com/a/1648671/1005334(使用PHP)。

– kasimir
2012年3月20日13:22

我不断收到有关此问题的警报,因为显然很多其他人偶然发现了该问题。我希望我可以将其标记为正确,因为它已经被很多人赞成。不幸的是,我终于对此解决方案做了个尝试(很久以前放弃了该项目),并且在Mac的Excel 2008中对我不起作用。很高兴为您工作。我已提出解决方案。但是它不能解决Excel for Mac 2008问题。如果有人在Mac上运气好的话,一定要让我(显然是所有人)知道。

– Ben Saufley
2012年5月31日在22:36

可以很好地将CSV文件输出到MS Excel Starter2010。非常感谢!

–杰米·德克斯特(Jamie Dexter)
13年2月7日在12:08

#3 楼

这是我的操作方法(这是提示浏览器下载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();


唯一可以解决的问题是在碰到空格时CSV预览中的UTF8编码问题在Mac上没有..但在Excel Mac 2008中没有...不知道为什么

评论


代码的UTF-8 BOM行通过导出到xls节省了我的时间

–Mladen Janjetovic
2014年3月28日14:23在

当我遇到这篇文章时,我一直在寻找一种以utf8格式直接输出到浏览器的方法,这是我的解决方案,其中包含BOM和二进制传输标头的信息。 $ outstream = fopen(“ php:// output”,'w'); fputs($ outstream,“ \ xEF \ xBB \ xBF”); foreach($ export as $ fields){fputcsv($ outstream,$ fields); } fclose($ outstream);

– B
2014年5月15日在18:26

错别字-删除双))。

–sitilge
15年6月2日在8:19

#4 楼

我只是处理了相同的问题,并提出了两种解决方案。



使用bpeterson76建议的PHPExcel类。


使用此类生成了最广泛兼容的文件,我能够从UTF-8编码的数据生成一个文件,该数据可以在Excel 2008 Mac,Excel 2007 Windows和Google Docs中很好地打开。
使用PHPExcel的最大问题是它运行缓慢且占用大量内存,这对于大小合理的文件而言不是问题,但是如果您的Excel / CSV文件具有数百行或数千行,则该库将变得不可用。

这是一个PHP方法,将获取一些TSV数据并将Excel文件输出到浏览器,请注意,它使用Excel5 Writer,这意味着该文件应与旧版本的Excel兼容,但是我再也无法访问任何文件,因此无法对其进行测试。

function excel_export($tsv_data, $filename) {
    $export_data = preg_split("/\n/", $tsv_data);
    foreach($export_data as &$row) {
        $row = preg_split("/\t/", $row);
    }

    include("includes/PHPExcel.php");
    include('includes/PHPExcel/Writer/Excel5.php');

    $objPHPExcel = new PHPExcel();          

    $objPHPExcel->setActiveSheetIndex(0);
    $sheet = $objPHPExcel->getActiveSheet();
    $row = '1';
    $col = "A";
    foreach($export_data as $row_cells) {
        if(!is_array($row_cells)) { continue; }
            foreach($row_cells as $cell) {
                $sheet->setCellValue($col.$row, $cell);
                $col++;
            }
        $row += 1;
        $col = "A";
    }

    $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
    header('Cache-Control: max-age=0');
    $objWriter->save('php://output');   
    exit;   
}





由于PHPExcel的效率问题,我还不得不弄清楚如何生成UTF-8 &Excel兼容CSV或TSV文件。


我能想到的最好的是与Excel 2008 Mac和Excel 2007 PC兼容的文件,但与Google Docs兼容,这对于我的应用程序已经足够了。
我在这里找到了解决方案,特别是这个答案,但是您也应该阅读已接受的答案,因为它可以解释问题。

这是我使用的PHP代码,请注意,我正在使用tsv数据(使用制表符作为分隔符而不是逗号):

header ( 'HTTP/1.1 200 OK' );
header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Content-Type: application/vnd.ms-excel') ;
header ( 'Content-Disposition: attachment;filename=export.csv' );
print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
exit;






评论


我在Windows-7 Excel 2007上遇到相同的问题,并尝试了所有建议,但失败了:(

–PHP Ferrari
2012年11月23日16:16

UTF-16LE解决方案是可行的。请注意,您必须正确设置tsv的格式,并且必须将其设置为tsc,因此制表符分隔而不是逗号分隔。另请参阅Marc的帖子:stackoverflow.com/a/1648671/1697370

–埃勒特·范·科珀伦
2014-12-5 12:17



#5 楼

我遇到了相同的问题,如下所示解决了问题:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();


#6 楼

在我的情况下,下面的方法非常适合使带有UTF-8字符的CSV文件在Excel中正确显示。

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);
BOM表标题将使Excel知道正确的编码。

评论


大为您兄弟<3

– Adrien G
18年11月26日在17:46

fprintf($ out,chr(0xEF).chr(0xBB).chr(0xBF)); <-这正是我所需要的。它像一种魅力。

– Alex
19年7月16日在10:52

谢谢花花公子,这只是工作正常,而其他解决方案则没有。

–spetsnaz
12月2日9:35

#7 楼

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

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


评论


如上面建议的那样,最好使用UTF-16LE,它涵盖了存在的每个字符。

–埃勒特·范·科珀伦
2014年12月5日12:16

我注意到mb_convert_encoding可以正常工作,并且在导出的XLS文件中正确显示了变音符号。我有mysql默认配置和apache + php设置为可与utf-8一起使用

–麦耶少年
2015年10月13日14:56

#8 楼

要对此进行跟进:

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

所以…似乎没有正确的答案。感谢所有建议。

我要说的是,我读过的所有内容中,@ Daniel Magliola关于BOM的建议可能是其他计算机的最佳答案。但这仍然不能解决我的问题。

评论


由于Mac和Windows在UTF8支持方面不一致,因此最好的选择是完全使用其他编码。我发现cp1252通常可以很好地与Microsoft兼容。 zh.wikipedia.org/wiki/Windows-1252

– s29
13年2月4日在3:27

Ben,这个问题的答案正确:)见我的!

–蒂姆·格罗内维尔德
2014年2月9日在7:54

#9 楼

在Windows和Mac OS上的excel中都可以正常工作。
修复了excel中不显示包含变音符号,西里尔字母,希腊字母和货币符号的字符的问题。
function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}


评论


这个解决方案使我也可以使导出工作适用于Google表格(其他一些失败)

– Cafn
18/09/19在10:51

该解决方案几乎是完美的,当一个单元格包含双引号“时,我才发现一个问题,它被跳过了。

–皮埃尔
12月4日9:05

#10 楼

CSV文件包含一个字节顺序标记。

或者按照建议的解决方法,只需在HTTP正文中回显它即可。

#11 楼

添加:

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


或:

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


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

示例:

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


#12 楼

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

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


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

评论


难以置信的;我尝试了至少10种其他解决方案,当通过fputs与UTF-8 BOM结合使用时,对我来说唯一的解决方案似乎就是这种解决方案。

–kaarto
18/12/14在10:12

这些字符是什么?必须是一些魔法。在这里尝试所有其他答案后,只有对我有用的解决方案。

–leymannx
8月17日21:36

这些字符组合在一起称为“字节对象标记”,它告诉应用程序检查它的其余内容应被视为UTF-8。

– Rvanlaak
10月15日12:55

#13 楼

由于UTF8编码不适用于Excel。您可以使用iconv()将数据转换为其他编码类型。

例如

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


评论


这是唯一适用于Excel Mac 2011的解决方案

–克里斯特·弗恩斯特罗姆(Christer Fernstrom)
16 Sep 19 '17:39

#14 楼

您可以使用iconv转换CSV字符串。
例如:

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


评论


很棒的示例文本;)

– ngeek
16年7月8日在7:22

#15 楼

经过调查,我发现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


#16 楼

**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}


评论


通常,如果答案包括对代码意图的解释,以及为什么在不引入其他代码的情况下解决问题的原因,则答案会更有帮助。

–蒂姆·迪克曼(Tim Diekmann)
18-3-27的14:00

#17 楼

仅输出Excel本身怎么样?这是一个非常好的类,它允许您在服务器端生成XLS文件。对于那些无法“弄清楚” csv的客户,到目前为止,我从未经常使用它。它还允许csv永远不会做的一些额外的格式化(阴影,行高,计算等)。

评论


请注意,phpexcel在大量数据方面存在问题。

–埃勒特·范·科珀伦
2014年12月5日,12:22

#18 楼

您必须使用编码“ Windows-1252”。

 header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");
 


也许您必须转换字符串:

 private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}
 


#19 楼

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

#20 楼

我在Mac上,就我而言,只需用"sep=;\n"指定分隔符,然后将文件编码为UTF-16LE即可,如下所示:

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


#21 楼

对我而言,以上解决方案均无效。以下是我为解决此问题所做的事情:
使用PHP代码中的此函数修改值:

$value = utf8_encode($value);


在excel工作表中此输出值正确。

#22 楼

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

评论


我已经尝试过了!但是它已经被编码为unicode文本…将其保存为unicode文本不会改变任何内容。在不正确解释所有特殊字符的情况下,如何将其保存为纯文本?

– Ben Saufley
2010年12月3日,18:55

我认为通过“将其保存为Unicode文本”,Alain可能意味着“ UTF-16LE”。 Windows经常(很难)使用“ Unicode”错误地引用带有领先BOM的UTF-16LE或UTF-16LE。记事本的“文件”->“保存”对话框以这种方式使用“ Unicode”。

–Thanatos
2010-12-5 7:16

#23 楼

当您将其另存为.txt文件并将其在excel中以逗号作为定界符打开时,是否还会出现问题?

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

评论


据我所知,CSV格式很好。我可以在TextEdit中制作一个“完美”的CSV,没问题,甚至可以将txt重命名为csv,因此它不会丢失任何秘密-CSV只是文本文件。此外,格式在Excel中非常完美,只是打破了特殊字符。但是以防万一,我尝试了您的建议,可悲的是产生了同样的问题。

– Ben Saufley
2010年12月3日,19:46

从“他们正在思考的WTF”部分中:请注意,根据Microsoft,正确的字段分隔符取决于语言环境。 “逗号分隔”文件可能要求在某些区域设置中将字段实际用分号分隔-除了建议使用OpenOffice外,您无能为力

– djn
2010-12-5在3:39

那真是太疯狂了-不幸的是,我没有遇到适当地划界的麻烦。我只是遇到这些特殊字符的麻烦。

– Ben Saufley
2010-12-04 21:42

#24 楼

这篇文章已经很老了,但是经过数小时的尝试,我想分享我的解决方案……也许它可以帮助处理Excel,Mac和CSV的人发现这一威胁。我正在考虑使用Excel Users作为数据库的输出动态生成csv。 (带有BOM的UTF-8)

我尝试了很多iconv,但是在Mac Excel 2004中无法使用德语变音符号。一种解决方案:PHPExcel。很好,但是对我的项目来说太多了。对我有用的是创建csv文件,并使用以下PHPsnippet将csv文件转换为xls:csv2xls。结果xls与excel德国变音符(ä,ö,Ü,...)。

#25 楼

我只是尝试了这些标头,并在Windows 7 PC上安装了Excel 2013,以正确导入带有特殊字符的CSV文件。字节顺序标记(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



评论


是的,这是正确的,它将在Windows的Excel中正常运行,但是如我的回答所述,它将无法在OS X的Excel中运行。

–蒂姆·格罗内维尔德
13年8月18日在0:03

#26 楼

否则,您可以:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);


#27 楼

适用于Mac Excel 2008的EASY解决方案:
我为此苦苦挣扎了很多次,但这是我的简单解决方法:
在Textwrangler中打开.csv文件,该文件应正确打开您的UTF-8字符。现在,在底部状态栏中,将文件格式从“ Unicode(UTF-8)”更改为“ Western(ISO Latin 1)”并保存文件。
现在转到Mac Excel 2008,然后选择“文件”>“导入”>选择csv>查找文件>在“文件源”中选择“ Windows(ANSI)”,瞧,UTF-8字符正确显示。至少对我有用...

#28 楼

我使用了它,而且效果很好

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
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');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;


#29 楼

#在PHP中输出Excel可以正确读取的UTF-8 CSV。

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';


评论


一个人一个答案就足够了。以后请记住,您可以随时将信息添加到答案中,无需创建2

–RiggsFolly
17-10-5在11:11



#30 楼

//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));


评论


这个问题不问如何转换,而是问如何输出。此贡献的相关部分(以UTF-16输出)已在“选定答案”中进行了贡献。

– Ben Saufley
2015年1月8日在16:45

@BenSaufley好吧,但是它用两行简单的代码解决了问题

– b3wii
2015年1月9日在8:30

这个问题已经解决,并且也进行了更彻底的解释。

– Ben Saufley
2015年1月9日,12:13