Wie kann ich eine UTF-8-CSV-Datei in PHP ausgeben, die Excel richtig liest?

Lesezeit: 11 Minuten

Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
Ben Sauley

Ich habe dieses sehr einfache Ding, das nur einige Sachen im CSV-Format ausgibt, aber es muss UTF-8 sein. Ich öffne diese Datei in TextEdit, TextMate oder Dreamweaver und sie zeigt UTF-8-Zeichen richtig an, aber wenn ich sie in Excel öffne, macht sie stattdessen diese dumme Sache. Hier ist, was ich am Anfang meines Dokuments habe:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Dies scheint alles den gewünschten Effekt zu haben, außer dass Excel (Mac, 2008) es nicht richtig importieren möchte. In Excel gibt es keine Optionen zum “Öffnen als UTF-8” oder so, also … ich werde ein wenig genervt.

Ich kann anscheinend nirgendwo klare Lösungen dafür finden, obwohl viele Leute das gleiche Problem haben. Das, was ich am häufigsten sehe, ist, die Stückliste einzufügen, aber ich kann nicht genau herausfinden, wie das geht. Wie Sie oben sehen können, bin ich nur echoWenn ich diese Daten speichere, schreibe ich keine Datei. Ich kann das tun, wenn ich muss, ich bin es nur nicht, weil es zu diesem Zeitpunkt keinen Bedarf dafür zu geben scheint. Irgendeine Hilfe?

Update: Ich habe versucht, die Stückliste als wiederzugeben echo pack("CCC", 0xef, 0xbb, 0xbf); die ich gerade von einer Website gezogen habe, die versucht hat, die Stückliste zu erkennen. Aber Excel hängt diese drei Zeichen beim Importieren einfach an die allererste Zelle an und bringt immer noch die Sonderzeichen durcheinander.

  • Excel bietet keine Option zum Anpassen des Zeichensatzes der eingehenden Datei? Bist du dir da 100% sicher? Ich habe keine Kopie zur Hand, also kann ich es nicht ausprobieren, aber ich stelle es mir vor Muss irgendwo ein Dropdown-Feld sein.

    – Pekka

    3. Dezember 2010 um 18:50 Uhr


  • Dies ist Excel auf einem Mac – es scheint eingeschränkter zu sein als Excel auf dem PC. Es gibt überhaupt keine Dropdowns im Öffnen-Dialog, darüber hinaus welche Dateitypen geöffnet werden können. Ich habe überall gesucht. Wenn es da ist, ist es dunkel. Ich würde sagen 98% sicher.

    – Ben Sauley

    3. Dezember 2010 um 18:54 Uhr


  • Microsoft Office oder OpenOffice?

    – ajreal

    3. Dezember 2010 um 18:59 Uhr

  • Microsoft ist in dieser Hinsicht besser, es gibt keine Möglichkeit (die ich gefunden habe), OpenOffice dazu zu bringen, den Zeichensatz zu erkennen, nicht einmal die BOM. Verdammt.

    – Ziant

    15. August 2012 um 7:45 Uhr

  • BOM hat auch keine Auswirkungen auf Microsoft Excel 2008 für Mac.

    – Ben Sauley

    15. August 2012 um 17:08 Uhr

Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
Daniel Magliola

Ich habe das gleiche (oder ähnliche) Problem.

In meinem Fall funktioniert es, wenn ich der Ausgabe eine Stückliste hinzufüge:

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

Ich glaube, das ist ein ziemlich hässlicher Hack, aber er hat bei mir funktioniert, zumindest für Excel 2007 Windows. Ich bin mir nicht sicher, ob es auf dem Mac funktioniert.

  • Hässlich, aber super hilfreich. Danke.

    – abelito

    26. November 2011 um 20:19 Uhr


  • Ich bin mir ziemlich sicher, dass das unter OS X leider überhaupt nicht funktioniert. Ich denke, es könnte tatsächlich die Stückliste beim Importieren anzeigen (Warnung: verschwommene Erinnerungen.)

    – davidtbernal

    31. Januar 2012 um 5:16 Uhr

  • Das ist richtig. Zumindest habe ich versucht, ein BOM voranzustellen, wie im obigen Beispiel, aber es zeigte tatsächlich nur einige unkonventionelle Zeichen am Anfang und zeigte die Sonderzeichen immer wieder falsch an (getestet in Excel 2011). Dies schien für mich in allen Einstellungen am besten zu funktionieren: stackoverflow.com/a/1648671/1005334 (mit PHP).

    – Kasimir

    20. März 2012 um 13:22 Uhr

  • Ich bekomme immer wieder Benachrichtigungen zu dieser Frage, weil anscheinend viele andere Leute darüber stolpern. Ich wünschte, ich könnte dies als richtig markieren, weil es oft positiv bewertet wurde. Leider habe ich dieser Lösung endlich eine Chance gegeben (das Projekt vor langer Zeit aufgegeben) und sie funktioniert bei mir in Excel 2008 für Mac nicht. Schön, dass es bei dir funktioniert. Ich habe die Lösung positiv bewertet. Aber es löst nicht das Problem von Excel für Mac 2008. Wenn jemand Glück auf dem Mac hat, lass es mich auf jeden Fall (und anscheinend jeder) wissen.

    – Ben Sauley

    31. Mai 2012 um 22:36 Uhr

  • Ich denke nicht Content-Encoding Header sollte verwendet werden, um den Zeichensatz mitzuteilen. Es geht eher um Komprimierung: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…

    – Marton Tamás

    29. Oktober 2018 um 17:59 Uhr

1646909052 234 Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
Tim Gröneveld

Zitieren ein Microsoft-Supporttechniker,

Excel für Mac unterstützt derzeit UTF-8 nicht

Aktualisierung, 2017: Dies gilt für alle früheren Versionen von Microsoft Excel für Mac Büro 2016. Neuere Versionen (ab Office 365) unterstützen jetzt UTF-8.

Um UTF-8-Inhalte auszugeben, die Excel sowohl unter Windows als auch OS X erfolgreich lesen kann, müssen Sie zwei Dinge tun:

  1. Stellen Sie sicher, dass Sie Ihren UTF-8-CSV-Text in UTF-16LE konvertieren

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. Stellen Sie sicher, dass Sie die hinzufügen UTF-16LE-Byte-Reihenfolgemarke zum Anfang der Datei

    chr(255) . chr(254)
    

Das nächste Problem, das nur mit Excel unter OS X auftritt (aber nicht Windows) beim Anzeigen einer CSV-Datei mit kommagetrennten Werten, Excel rendert Zeilen nur mit einer Zeile und dem gesamten Text zusammen mit den Kommas in der ersten Zeile.

Um dies zu vermeiden, verwenden Sie Tabulatoren als getrennten Wert.

ich benutzte diese Funktion aus den PHP-Kommentaren (mit Tabulatoren “\t” anstelle von Kommas) und es funktionierte perfekt unter OS X und Windows Excel.

Beachten Sie, dass ich zur Behebung eines Problems mit einer leeren Spalte am Ende einer Zeile die folgende Codezeile ändern musste:

    $field_cnt = count($fields);

zu

    $field_cnt = count($fields)-1;

Wie einige der anderen Kommentare auf dieser Seite sagen, haben andere Tabellenkalkulations-Apps wie OpenOffice Calc, Apples eigene Numbers und Google Docs Spreadsheet keine Probleme mit UTF-8-Dateien mit Kommas.

In der Tabelle in dieser Frage erfahren Sie, was für Unicode-CSV-Dateien in Excel funktioniert und was nicht


Als Randnotiz könnte ich das hinzufügen, wenn Sie verwenden Komponistsollten Sie sich das Hinzufügen ansehen League\Csv zu Ihren Anforderungen. League\Csv hat eine wirklich schöne API zum Erstellen von CSV-Dateien.

Benutzen League\Csv mit dieser Methode zum Erstellen von CSV-Dateien, check out dieses Beispiel

  • Nenn mich dumm, aber ich kann das nicht zum Laufen bringen. Ich habe meine Daten mit der Funktion mb_convert_encoding konvertiert und die BOM vor dem Dateiinhalt ausgegeben, aber ich erhalte nur eine einzelne Zeile chinesischer Zeichen, wenn ich die Datei in Excel öffne. Ich verwende im Moment immer noch Kommas anstelle von Tabulatoren, aber vermutlich sollte das nicht dazu führen, was ich sehe.

    – John Rix

    11. August 2014 um 22:38 Uhr

  • Diese Lösung löste auch das UTF8-Problem für mich auf Mac und Windows. Ich fand auch, dass das Hinzufügen einer Zeile mit sep=; oder sep=, in die CSV-Datei teilt Excel mit, wie die CSV getrennt und Spalten wieder korrekt erstellt werden.

    – Luc Wollants

    13. November 2014 um 14:05 Uhr

  • Ich stellte fest, dass die Dinge verstümmelt herauskamen, wenn ich die Zeichenfolge nur als BOM begann und dann in einer anderen Zeile die hinzufügte "sep=,\n", dann in einer anderen Zeile die Daten hinzugefügt. Die Dinge waren in Ordnung, wenn ich alles in einer Zeile machte ($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Auf dem Mac sieht jetzt alles gut aus. Ich habe kein Windows zum Testen.

    – Zittern

    24. Dezember 2014 um 2:24 Uhr


  • Das einzige, was für mich voll funktioniert hat. Die Inkonsistenz von Microsoft erstaunt mich immer wieder. Beim Speichern einer normalen CSV-Datei wird “,” als Trennzeichen verwendet, aber wenn eine Stückliste vorhanden ist, wird aus irgendeinem Grund mit “\ t” gespeichert. Das C in .csv steht für “COMMA” verdammt noch mal. Es ist wirklich nicht schwer zu tun.

    – Phil

    20. Oktober 2015 um 8:11 Uhr

  • In meinem Excel Mac 2011 verwandelt das Einfügen von chr(255).chr(254) am Anfang der Datei alle Zeichen in Chinesisch (oder Koreanisch, kann den Unterschied nicht wirklich erkennen). Die einzige Lösung, die für mich funktioniert hat, war die mit iconv

    – Christer Fernstrom

    19. September 2016 um 17:38 Uhr

1646909052 506 Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
Jazzer

So habe ich es gemacht (das soll den Browser auffordern, die CSV-Datei herunterzuladen):

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

Das einzige, was es behoben hat, war das UTF8-Codierungsproblem in der CSV-Vorschau, wenn Sie auf dem Mac die Leertaste gedrückt haben. Aber nicht in Excel Mac 2008 … ich weiß nicht warum

  • Die UTF-8-BOM-Zeile des Codes rettet mir den Tag mit dem Export nach xls

    – Mladen Janjetović

    28. März 2014 um 14:23 Uhr

  • Ich suchte nach einer Möglichkeit, direkt als utf8 im Browser auszugeben, als ich auf diesen Beitrag stieß. Hier ist meine Lösung mit Credits für diesen Beitrag für die BOM und den Header der binären Übertragung. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );

    – Wird B.

    15. Mai 2014 um 18:26 Uhr

  • Tippfehler – entfernen Sie das Doppel )).

    – Sitilge

    2. Juni 2015 um 8:19 Uhr

In meinem Fall funktioniert das Folgende sehr gut, um eine CSV-Datei mit UTF-8-Zeichen zu erstellen, die in Excel korrekt angezeigt werden.

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

Die 0xEF 0xBB 0xBF Der BOM-Header teilt Excel die korrekte Kodierung mit.

1646909053 892 Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
Jasdeep Gosal

Ich habe mich gerade mit dem gleichen Problem befasst und bin auf zwei Lösungen gekommen.

  1. Verwenden Sie die PHPExcel Klasse wie von bpeterson76 vorgeschlagen.

    • Die Verwendung dieser Klasse generiert die am weitesten kompatible Datei. Ich konnte eine Datei aus UTF-8-codierten Daten generieren, die sich problemlos in Excel 2008 Mac, Excel 2007 Windows und Google Docs öffnen ließ.
    • Das größte Problem bei der Verwendung von PHPExcel ist, dass es langsam ist und viel Speicher verbraucht, was bei Dateien mit angemessener Größe kein Problem darstellt, aber Wenn Ihre Excel-/CSV-Datei Hunderte oder Tausende von Zeilen enthält, wird diese Bibliothek unbrauchbar.
    • Hier ist eine PHP-Methode, die einige TSV-Daten nimmt und eine Excel-Datei an den Browser ausgibt. Beachten Sie, dass sie den Excel5-Writer verwendet, was bedeutet, dass die Datei mit älteren Versionen von Excel kompatibel sein sollte, aber ich habe keinen Zugriff mehr darauf. daher kann ich sie nicht testen.

      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. Aufgrund der Effizienzprobleme mit PHPExcel musste ich auch herausfinden, wie man eine UTF-8- und Excel-kompatible CSV- oder TSV-Datei generiert.

    • Das Beste, was mir einfallen konnte, war eine Datei, die mit Excel 2008 Mac und Excel 2007 PC kompatibel war, aber nicht mit Google Docs, was für meine Anwendung gut genug ist.
    • Ich habe hier die Lösung gefunden, speziell diese Antwort, aber Sie sollten auch die akzeptierte Antwort lesen, da sie das Problem erklärt.
    • Hier ist der PHP-Code, den ich verwendet habe, beachten Sie, dass ich tsv-Daten verwende (Tabs als Trennzeichen anstelle von Kommas):

      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;
      

  • Ich habe das gleiche Problem unter Windows-7 Excel 2007 und habe alle Vorschläge ausprobiert, bin aber fehlgeschlagen 🙁

    – PHP-Ferrari

    23. November 2012 um 16:16 Uhr

  • Die UTF-16LE-Lösung hat funktioniert. Beachten Sie, dass Sie das tsv korrekt formatieren müssen, und es muss tsc sein, also tabulatorgetrennt, nicht kommagetrennt. Siehe auch Marcs Beitrag hier: stackoverflow.com/a/1648671/1697370

    – Ellert van Koperen

    5. Dezember 2014 um 12:17 Uhr


1646909053 452 Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
Reza Mamun

Ich hatte das gleiche Problem und es wurde wie folgt gelöst:

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

  • Ich habe das gleiche Problem unter Windows-7 Excel 2007 und habe alle Vorschläge ausprobiert, bin aber fehlgeschlagen 🙁

    – PHP-Ferrari

    23. November 2012 um 16:16 Uhr

  • Die UTF-16LE-Lösung hat funktioniert. Beachten Sie, dass Sie das tsv korrekt formatieren müssen, und es muss tsc sein, also tabulatorgetrennt, nicht kommagetrennt. Siehe auch Marcs Beitrag hier: stackoverflow.com/a/1648671/1697370

    – Ellert van Koperen

    5. Dezember 2014 um 12:17 Uhr


1646909053 466 Wie kann ich eine UTF 8 CSV Datei in PHP ausgeben die
j0k

Excel unterstützt UTF-8 nicht. Sie müssen Ihren UTF-8-Text in UCS-2LE codieren.

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

  • Verwenden Sie besser UTF-16LE wie oben vorgeschlagen, das alle existierenden Zeichen abdeckt.

    – Ellert van Koperen

    5. Dezember 2014 um 12:16 Uhr

  • Ich habe festgestellt, dass diese mb_convert_encoding gut funktioniert und diakritische Zeichen in meiner exportierten XLS-Datei korrekt anzeigt. Ich habe mysql-Standardkonfigurationen und Apache + PHP so eingestellt, dass es mit utf-8 funktioniert

    – Junior Mayhé

    13. Oktober 2015 um 14:56 Uhr

987600cookie-checkWie kann ich eine UTF-8-CSV-Datei in PHP ausgeben, die Excel richtig liest?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy