如何在PHP中输出Excel可以正确读取的UTF-8 CSV?


191

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


2
Excel没有提供调整传入文件字符集的选项?您对此有100%的把握吗?我没有方便的副本,因此无法尝试,但我想那儿一定有一个下拉框。
Pekka 2010年

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

Microsoft Office还是OpenOffice?
ajreal 2010年

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

BOM对Mac的Microsoft Excel 2008也不起作用。
Ben Saufley 2012年

Answers:


133

引用Microsoft支持工程师的话

Excel for Mac当前不支持UTF-8

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

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

  1. 确保将您的UTF-8 CSV文本转换为UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. 确保将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文件的方法,请查看此示例


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

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

2
此解决方案还为我在Mac和Windows上解决了UTF8问题。我还发现,在CSV文件中添加一行,sep=;或者sep=,告诉该行告诉Excel如何分隔CSV,并且将再次正确创建列。
Luc Wollants 2014年

5
我发现如果将字符串作为BOM开始,则出现乱码,然后在另一行添加"sep=,\n",然后在另一行添加数据。如果我一行全部完成($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');),一切都很好。现在在Mac上一切看起来都很棒。我没有Windows可以测试。
tremby 2014年

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

288

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

就我而言,如果将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上运行。


10
丑陋,但超级有帮助。谢谢。
abelito 2011年

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

2
这是对的。至少,像上面的示例一样,我尝试使用BOM表,但是确实确实在开始时显示了一些时髦的字符,并一直显示错误的特殊字符(在Excel 2011中进行了测试)。在所有设置下,这似乎对我来说都是最有效的:stackoverflow.com/a/1648671/1005334(使用PHP)。
kasimir 2012年

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

可以很好地将CSV文件输出到MS Excel Starter2010。非常感谢!
杰米·德克斯特

32

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

当您在Mac上按空格键时,它唯一修复了CSV预览中的UTF8编码问题的方法..但是在Excel Mac 2008中却没有...不知道为什么


1
代码的UTF-8 BOM行通过导出到xls节省了我的一天
Mladen Janjetovic

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

错字-删除双))
sitilge

22

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

  1. 使用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;   
      }
  2. 由于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

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

16

我遇到了同样的问题,解决方法如下:

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

12

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

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

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

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

10

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

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

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


1
大为您兄弟<3
Adrien G

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

8

要对此进行跟进:

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

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

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


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

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

7

对于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

6

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

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


4

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

例如

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

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

4

加:

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

3

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

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

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


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

2

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

2
**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;
}

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

1

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


请注意,phpexcel在大量数据方面存在问题。
Ellert van Koperen 2014年

1

您可以使用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

1

您必须使用编码“ 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);
}

1

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



1

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

$value = utf8_encode($value);

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


0

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


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

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

0

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

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


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

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

那真是太疯狂了-不幸的是,我在正确地划分字段时没有遇到麻烦。我只是遇到这些特殊字符的麻烦。
Ben Saufley,2010年

0

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

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


0

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

    header('Content-Encoding:UTF-8');
    header('Content-type:text / csv; charset = UTF-8');
    标头(“内容处置:附件;文件名= filename.csv”);
    header(“ Pragma:public”);
    header(“ Expires:0”);
    回声“ \ xEF \ xBB \ xBF”; // UTF-8 BOM


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

0

否则,您可以:

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

0

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


0

我用这个并且有效

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;

0

#输出PHP将正确读取的UTF-8 CSV格式的CSV文件。

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

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

-1
//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年

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

这个问题已经解决,并且也进行了更彻底的解释。
Ben Saufley,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.