Umlaute in CSV-Export per PHP / Zeichensatzkonvertierung Encoding

Oft kommt es vor, dass vom Kunden der Export von Daten nach Excel gewünscht ist. Der einfachste und schnellste Weg führt dabei oft über das CSV-Format. Doch wenn unter Windows in MS Excel die über PHP (fputcsv) erzeugte CSV geöffnet wird, werden Umlaute und Sonderzeiche (ÖÜÄüöäß) meist sonderbar dargestellt.

Grund hierfür ist der falsche Zeichensatz. Je nach Konfiguration des Servers werden die Daten zumeist im ISO-8859-1 oder UTF-8 geschrieben bzw. übertragen.

Excel erwartet jedoch standardmässig den Windows-1252 Zeichensatz. Folgende kleine Funktion hilft bei der Konvertierung der Zeichen vor der Verwendung von z.B. fputcsv :

<?
function convertToWindowsCharset($string) {
  $charset =  mb_detect_encoding(
	$string,
	"UTF-8, ISO-8859-1, ISO-8859-15",
	true
  );

  $string =  mb_convert_encoding($string, "Windows-1252", $charset);
  return $string;
}
?>

Über Pierre

Pierre ist Mitbegründer und einer der beiden Geschäftsführer von next.motion. Seine Leidenschaft äußert sich in der Konzeption und Programmierung komplexer Webanwendungen. Er ist der Richtungsgeber und die treibende Kraft der next.motion für Ihre Webprojekte. Die Liebe zur Sache ist es, was ihn zu einer ständigen Weiterentwicklung treibt, um unseren Kunden kontinuierlich ein modernes Produkt auf der Höhe der Zeit zu bieten.
Dieser Beitrag wurde unter New Media, PHP, Programmierung abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

4 Antworten auf Umlaute in CSV-Export per PHP / Zeichensatzkonvertierung Encoding

  1. tom sagt:

    und weshalb geht das nicht?
    $fp = fopen(‘csv/file.csv’, ‘a’);
    foreach ($felder as $fields) {

    $fields = mb_convert_encoding($fields, “Windows-1252″);
    fputcsv($fp, $fields,’;',’”‘);

    • Pierre sagt:

      Hallo Tom,

      ich habe deinen Code mal erweitert, so dass er funktionieren sollte.

      <?
      $fp = fopen('csv/file.csv', 'a');
      $converted_fields = array();
      foreach ($felder as $value) {
      $converted_fields[] = mb_convert_encoding($value, "Windows-1252");
      }
      fputcsv($fp, $converted_fields,';','"');
      fclose($fp);
      ?>

      Du kannst folgende Zeile auch tauschen mit der oben beschriebenen Funktion:
      $converted_fields[] = mb_convert_encoding($value, "Windows-1252");

      Dann müsste sie entsprechend so aussehen:
      $converted_fields[] = convertToWindowsCharset($value);

      Durch Verwendung der Funktion mb_detect_encoding stellen wir das Verhalten beim Ermitteln des Zeichensatzes sicher. Ohne den $charset würde mb_convert_encoding standardmässig die Ermittlung entsprechend mb_detect_order() vornehmen. Dies Reihenfolge und ob es “Stricted” ist, ist dann je nach Konfiguration in der php.ini unterschiedlich.

      $charset = mb_detect_encoding(
      $string,
      "UTF-8, ISO-8859-1, ISO-8859-15", // Reihenfolge
      true // Strict-Mode
      );

      Weitere Informationen zu den Sachen findest du hier:
      http://www.php.net/manual/de/function.mb-detect-encoding.php
      http://www.php.net/manual/de/function.mb-convert-encoding.php

      Viele Grüße
      Pierre

  2. Alexander sagt:

    Ich versuche derzeit ein Formular auszuwerten und die daten per csv zu versenden aber bei mir macht er die umlaute zu komischen zeichen.

    habe es mit


    $fp = fopen('excel.csv', 'w');

    $produkte[0][0]= "Anrede";
    $produkte[0][1]= "Name";
    $produkte[0][2]= "Vorname";
    $produkte[0][3]= "Geburtstag";
    $produkte[0][4]= "Geburtsmonat";
    $produkte[0][5]= "Geburtsjahr";
    $produkte[0][6]= "Straße";
    $produkte[0][7]= "Straßennummer";
    $produkte[0][8]= "Ort";
    $produkte[0][9]= "Postleitzahl";
    $produkte[0][10]= "Familie";
    $produkte[0][11]= "Öffentlicherdienst";
    $produkte[0][12]= "Anrede Partner";
    $produkte[0][13]= "Name Partner";

    $produkte[1][0]= $_COOKIE['anrede'];
    $produkte[1][1]= $_COOKIE['name'];
    $produkte[1][2]= $_COOKIE['vorname'];
    $produkte[1][3]= $_COOKIE['geburtstag'];
    $produkte[1][4]= $_COOKIE['geburtsmonat'];
    $produkte[1][5]= $_COOKIE['geburtsjahr'];
    $produkte[1][6]= $_COOKIE['strasze'];
    $produkte[1][7]= $_COOKIE['straszennr'];
    $produkte[1][8]= $_COOKIE['ort'];
    $produkte[1][9]= $_COOKIE['plz'];
    $produkte[1][10]= $_COOKIE['familie'];
    $produkte[1][11]= $_COOKIE['od'];
    $produkte[1][12]= $_COOKIE['anrede_partner'];
    $produkte[1][13]= $_COOKIE['name_partner'];

    foreach ($produkte as $fields) {

    $fields[] = mb_convert_encoding($str, "UTF-8");
    fputcsv($fp, $fields, ';');
    }

    fclose($fp);

    versucht.

    aber wenn ich dann die datei mit excel öffne habe ich wieder komische zeichen drin.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>