Bernd: utf8, Sonderzeichen in CSV Datei richtig anzeigen

Ich habe ein Problem. Ich möchte meine MYSQL Datenbank als CSV abspeichern. Das Ergbeniss ist eigentlich gut, bis das die Sonderzeichen nicht korrekt ausgegeben werden. Aus für wird für.

Ich dachte das ich es mit

header("Content-type: application/csv; charset=utf-8");

mein Probem behebt, doch der Gedanke war leider falsch.

header("Content-type: application/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=myfile.csv");

while ($ausgabe = mysql_fetch_object($result))
{
.
.
.
}

exit;

Wie kann ich die SOnderzeichen wieder richtig darstellen?

Bernd

  1. Hallo,

    Ich möchte meine MYSQL Datenbank als CSV abspeichern. Das Ergbeniss ist eigentlich gut, bis das die Sonderzeichen nicht korrekt ausgegeben werden. Aus für wird für.

    wie stellst du das fest? Besser gesagt, womit? Wenn du die Datei mit einem Editor öffnest und dessen Codierung manuell auf UTF-8 einstellst, wird es dann richtig angezeigt?

    Ich dachte das ich es mit

    header("Content-type: application/csv; charset=utf-8");

    mein Probem behebt, doch der Gedanke war leider falsch.

    Der Gedanke ist möglicherweise sogar richtig, aber er hilft nicht wirklich. Denn CSV sieht keine Möglichkeit vor, die Zeichencodierung explizit anzugeben bzw. zu speichern, das ist immer Sache des verarbeitenden Programms.

    header("Content-type: application/csv; charset=utf-8");
    
    > header("Content-Disposition: attachment; filename=myfile.csv");
    > 
    > while ($ausgabe = mysql_fetch_object($result))
    > {
    > .
    > .
    > .
    > }
    > 
    > exit;
    
    

    Wie gesagt, vermutlich erzeugst du eine korrekt in UTF-8 codierte CSV-Datei. Nur das Programm, mit dem du diese Datei weiter verarbeitest, begreift das nicht oder ist falsch eingestellt.

    So long,  Martin

    PS:

    1. Umlaute sind in CSV keine Sonderzeichen. Kommas oder ggf. Anführungszeichen wären welche.
    2. "Ergebnis" hat nichts mit Läuseeiern zu tun, daher auch nicht mit Doppel-s.
    --
    F: Was sagt der große Keks zum kleinen Keks? A: Du kannst dich jetzt verkrümeln. Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Lieber Martin,

      1. "Ergebnis" hat nichts mit Läuseeiern zu tun, daher auch nicht mit Doppel-s.

      <klugschiss mode="schulmeisterlich">Darum schrieb er auch Ergbeniss, also Erg-b-e-niss und nicht Erg-e-b-niss.</klugschiss>

      Liebe Grüße,

      Felix Riesterer.

      --
      "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
  2. Hi,

    Ich habe ein Problem.

    wie es aussieht, hast Du zwei Probleme.

    Ich möchte meine MYSQL Datenbank als CSV abspeichern. Das Ergbeniss ist eigentlich gut, bis das die Sonderzeichen nicht korrekt ausgegeben werden. Aus für wird für.

    Ich dachte das ich es mit

    header("Content-type: application/csv; charset=utf-8");

    mein Probem behebt, doch der Gedanke war leider falsch.

    CSV-Dateien haben keine HTTP-Header.

    Ist jetzt also die erste Frage, über welches Übertragungsprotokoll Du die MySQL-Daten nach CSV exportieren willst. Die zweite Frage ist dann, was das CSV-Programm kann.

    Ich habe neulich eine CSV-Datei bekommen, über die ich erst gestutzt habe. Die hatte einen Header (aber nicht HTTP). Und -oh Wunder- Excel hat die Parameter alle richtig interpretiert. Es waren Angaben für Separator, Delimiter, Spaltennamen, Spaltentyp und Codierung vorhanden.

    Leider war das in der Firma und ich im Stress. Ich habe sie mir den Kopf also leider nicht gleich gesichert für meine Sammlung. Die Daten hätte ich sowieso nicht mitnehmen dürfen...

    Aufgrund deines Postings hier such ich nun schon über eine Stunde in den Microsoft-Wissensdatenbanken nach einer Doku. Bisher war das leider erfolglos. Aber da würde ich an deiner Stelle mal weitersuchen. Und wenn Du was findest, poste das bitte hier.

    Greez Fritz!

    1. Hallo,

      Ich dachte das ich es mit

      header("Content-type: application/csv; charset=utf-8");

      mein Probem behebt, doch der Gedanke war leider falsch.

      CSV-Dateien haben keine HTTP-Header.

      nein, nicht per se. Aber allein dadurch, dass Bernd überhaupt HTTP-Header erwähnt, bin ich davon ausgegangen, dass er die CSV-Daten per HTTP übertragen und dann clientseitig speichern will. Nur so würde ja auch der Content-Disposition-Header irgendeinen Sinn ergeben.

      Aber jetzt, da ich mir das Startposting nochmal anschaue, bin ich mir da nicht mehr so sicher, zumal Bernd gerade den Teil weggelassen hat, der die Daten ausgibt. Direkt serverseitig von mySQL-DB nach CSV wäre natürlich auch nicht ganz von der Hand zu weisen ...

      Ich habe neulich eine CSV-Datei bekommen, über die ich erst gestutzt habe. Die hatte einen Header (aber nicht HTTP). Und -oh Wunder- Excel hat die Parameter alle richtig interpretiert. Es waren Angaben für Separator, Delimiter, Spaltennamen, Spaltentyp und Codierung vorhanden.

      Das würde mich jetzt auch interessieren. Ich kenne bisher nur den Sonderfall, dass die erste Zeile keinen Datensatz im eigentlichen Sinn enthält, sondern nur die Spaltennamen - aber eben im gleichen Format wie die folgenden Datensätze.

      Ciao,  Martin

      --
      Die Zeit, die man zur Fertigstellung eines Projekts wirklich braucht, ist immer mindestens doppelt so lang wie geplant. Wurde dieser Umstand bei der Planung bereits berücksichtigt, gilt das Prinzip der Rekursion. Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hi Martin,

        Ich habe neulich eine CSV-Datei bekommen, über die ich erst gestutzt habe. Die hatte einen Header (aber nicht HTTP). Und -oh Wunder- Excel hat die Parameter alle richtig interpretiert. Es waren Angaben für Separator, Delimiter, Spaltennamen, Spaltentyp und Codierung vorhanden.

        Das würde mich jetzt auch interessieren. Ich kenne bisher nur den Sonderfall, dass die erste Zeile keinen Datensatz im eigentlichen Sinn enthält, sondern nur die Spaltennamen - aber eben im gleichen Format wie die folgenden Datensätze.

        Ich kriege das aus dem Gedächtnis auch nicht mehr so ganz zusammen. Zumindest enthielt diese Zeile Zuwweisungen mit Gleichheitszeichen. Und ich erinnere mich an die Begriffe Seperator (sep=; stand drin) und Delimiter (delim=") (im Gegensatz zu PHPs Ausdrucksweise "enclosure"). An die übrigen Schlüsselworte erinnere ich mich jetzt nicht mehr. Aber ich glaube, die waren immer Name=Value pro Zeile.

        Ich habe kurz damit gespielt und Excel (ein älteres, ich denke 2003) hat kurz gekotzt. Die Originalwerte wiederhergestellt hat es dann sofort wieder alles richtig interpretiert und auch die numerischen Spalten rechtsbündig dargestellt.

        Ich habe diese Woche Urlaub. Mit Glück finde ich die Datei nächste Woche noch wieder.

        Greez Fritz!

  3. Hi,

    Das Ergbeniss ist eigentlich gut, bis das die Sonderzeichen nicht korrekt ausgegeben werden. Aus für wird für.

    dieses ewige Umlautproblem .. :-| seit dem ich die DB öffne mit:

    $mysqli = new mysqli($host, $user,$pass, $DB);
    mysqli_set_charset($mysqli, "utf8");
    

    ist das Problem endlich weg. :-) meine html-forms mit: <meta charset="windows-1252"> Vielleicht klappts bei dir auch ;-)

    Viele Grüße aus LA

    --
    ralphi
    1. Hallo

      Aus für wird für.

      seit dem ich die DB öffne mit:

      $mysqli = new mysqli($host, $user,$pass, $DB);
      
      > mysqli_set_charset($mysqli, "utf8");
      
      

      ist das Problem endlich weg. :-) meine html-forms mit: <meta charset="windows-1252">

      Ist es nicht auch für dich widersinnig, die Daten mit der Kodierung „UTF-8“ auszulesen und darzustellen, im HTML-Dokument, in dem diese Darstellung erfolgt, aber als Angabe über die Kodierung „windows-1252“ anzugeben? Davon abgesehen ist es natürlich auch interessant, in welcher Kodierung das Dokument tatsächlich abgespeichert wird und welche Kodierung denn der Server im HTTP-Header vorgibt.

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, "Wachen! Wachen!" ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
      1. Hi,

        Ist es nicht auch für dich widersinnig, die Daten mit der Kodierung „UTF-8“ auszulesen und darzustellen, im HTML-Dokument, in dem diese Darstellung erfolgt, aber als Angabe über die Kodierung „windows-1252“ anzugeben? Davon abgesehen ist es natürlich auch interessant, in welcher Kodierung das Dokument tatsächlich abgespeichert wird und welche Kodierung denn der Server im HTTP-Header vorgibt.

        Also: wenn ich eine form habe <input type="text" name="wert"> dort:     "ÄÖÜ" eingebe dann speicher mit (php): INSERT INTO table (feld) VALUES (".$_POST['wert'].");

        dann wieder ausgebe mit

        $mysqli = new mysqli($host, $user,$pass, $DB);
        mysqli_set_charset($mysqli, "utf8");
        ..
        echo "<p>".$row['feld']."</p>";
        

        hab ich   "ÄÖÜ"

        Wo ist (dann) da der Fehler?

        Viele Grüße aus LA

        --
        ralphi
        1. Hallo,

          wenn ich eine form habe

          du meinst "ein Formular"?

          <input type="text" name="wert"> dort:     "ÄÖÜ" eingebe dann speicher mit (php): INSERT INTO table (feld) VALUES (".$_POST['wert'].");

          dann wieder ausgebe mit

          $mysqli = new mysqli($host, $user,$pass, $DB);
          
          > mysqli_set_charset($mysqli, "utf8");
          > ..
          > echo "<p>".$row['feld']."</p>";
          
          

          hab ich   "ÄÖÜ"

          Wo ist (dann) da der Fehler?

          Zumächst mal in der völlig fehlenden Kontext-Behandlung. Abgesehen davon kommen deine Daten wieder so an, wie sie eingegeben wurden. Das kann entweder heißen, dass in der Verarbeitungskette alles richtig ist, oder aber, dass zwei Fehler sich gegenseitig kompensieren.

          Zumindest vermute ich aber mal, dass deine im Vorposting empfohlene meta-Angabe ignoriert wurde, weil sie von einem gleichnamigen (und mutmaßlich korrekten) HTTP-Header überstimmt wurde. Denn sonst wäre "Windows-1252" völliger Humbug, wenn ansonsten die ganze Verarbeitung drumherum auf UTF-8 abgestimmt ist.

          Ciao,  Martin

          --
          Zwei Politiker auf dem Weg zum Sitzungssaal: "Was sagten Sie in ihrer Rede neulich noch zur Rentenreform?" - "Nichts." - "Ja, schon klar. Aber wie haben Sie es formuliert?" Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Hi Martin,

            Abgesehen davon kommen deine Daten wieder so an, wie sie eingegeben wurden. Das kann entweder heißen, dass in der Verarbeitungskette alles richtig ist, oder aber, dass zwei Fehler sich gegenseitig kompensieren.

            möglich :-)

            Zumindest vermute ich aber mal, dass deine im Vorposting empfohlene meta-Angabe ignoriert wurde, weil sie von einem gleichnamigen (und mutmaßlich korrekten) HTTP-Header überstimmt wurde. Denn sonst wäre "Windows-1252" völliger Humbug, wenn ansonsten die ganze Verarbeitung drumherum auf UTF-8 abgestimmt ist.

            mein geschriebenes ist nicht ganz vollständig :-|. Ich arbeite in letzter Zeit mit HTML und PHP in getrennten Dateien (wegen App-Konvertierung). Was mit echo ausgegeben wird, landet mit AJAX in der HTML.

            Viele Grüße aus LA

            --
            ralphi
  4. @@Bernd:

    Ich habe ein Problem. Ich möchte meine MYSQL Datenbank als CSV abspeichern.

    Das sollte 2015 kein Problem sein. Sollte man meinen.

    Das Ergbeniss ist eigentlich gut, bis das die Sonderzeichen nicht korrekt ausgegeben werden. Aus für wird für.

    Umlaute sind keine Sonderzeichen.

    LLAP

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)