tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
1550
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Pinky Pinky ist offline Mitglied Gold
    Registriert seit
    Aug 2003
    Beiträge
    161
    Hallo zusammen,

    ich habe mir eine Exportfunktion geschrieben, die mir MySQL-Daten rauslesen soll und per header() als Exceldatei zum speichern anbieten soll. Das funktioniert auch ohne Probleme. Doch leider machen die verflixten Umlaute wieder mal Schwierigkeiten. Diese werden nämlich ganz komisch angezeigt:

    ä wir zu √§
    ü wir zu √º
    ö wir zu √∂

    Die MySQL-Tabelle sowie jedes Feld in der Tabelle hat die Kollation utf8_general_ci.

    Bei der MySQL-Verbindung habe ich hinzugefügt:
    PHP-Code:
    mysql_query("SET NAMES 'utf8'"$verbindung);
    mysql_query("SET CHARACTER SET 'utf8'"$verbindung); 
    Zudem habe ich im Exportfile folgenden Befehl ganz oben eingefügt:
    PHP-Code:
    header("Content-type: text/html; charset=utf-8"); 
    Doch eben, das alles nützt nichts. Kann mir jemand helfen, was ich noch ändern muss? Wenn ihr noch mehr Code braucht, einfach schreiben, liefere ich gerne.

    Lieber Gruss & herzlichen Dank im Voraus.
    Euer Pinky
     

  2. #2
    Registriert seit
    May 2007
    Ort
    Köln / Bonn
    Beiträge
    844
    Blog-Einträge
    4
    Bis du dir so sicher das MS Excel UTF-8 kann? Ich hatte bisher noch keine Möglichkeit gefunden eine CSV Datei in utf8 in Excel korrekt darzustellen.

    Vielleicht solltest du mal mit iso 8859 als Zeichensatz des Dokumentes versuchen.
     
    Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

  3. #3
    Pinky Pinky ist offline Mitglied Gold
    Registriert seit
    Aug 2003
    Beiträge
    161
    Danke für die Antwort.

    Habe den Header in der Datei mal auf folgende Zeile geändert:
    PHP-Code:
    header("Content-type: text/html; charset=ISO-8859-1"); 
    Danach exportierte ich nochmals, doch die Umlaute sind immer noch unschön.

    Darauf änderte ich die Kollation in der MySQL-DB auf latin1_general_ci und exportierte nochmals das File, doch auch dies blieb ohne Erfolg.

    Ich verstehe diesen ganzen Zeichencodierungsjungel überhaupt nicht, darum bin ich auch dermassen ratlos. Warum gibt es so viele Codierungen? Ist das lediglich computerentwicklungsbedingt?

    Bin gerne für weitere Ratschläge offen .

    Danke vielmals & lieber Gruss
    Euer Pinky
     

  4. #4
    Registriert seit
    May 2007
    Ort
    Köln / Bonn
    Beiträge
    844
    Blog-Einträge
    4
    Die Header ausgabe zuändern genau wie die Datenbank bringt nichts, da die Daten warscheinlich schon als UTF8 darin enthalten sind. Die collation hinterher zu ändern. Ändert nichts an den Daten und damit machst du es nur noch schlimmer .)

    Entweder du sagst der Datenbankverbinung das es die Daten bei der Ausgabe nach iso hin codieren soll. Oder du verwendest utf8_decode() auf die entsprechenden Felder.
     
    Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

  5. #5
    Pinky Pinky ist offline Mitglied Gold
    Registriert seit
    Aug 2003
    Beiträge
    161
    Danke für die schnelle Antwort. Habe ich sofort versucht und tatsächlich ist etwas geschehen. Die Umalute werden nun folgendermassen dargestellt (muss das etwas grösser machen, damit die Zeichen erkannt werden können):

    ä wird zu ‰
    ö wird zu ˆ
    ü wird zu ¸


    Ich habe auch gerade versucht, dieses Zeichen per
    PHP-Code:
    str_replace() 
    in ä, ö, ü's umzuwandeln mit negativem Resultat. Nichts geschah...!

    Was ich noch nicht versucht habe ist, der Datenbankverbindung zu sagen, sie soll mir die Daten ISO-Codiert rausgeben. Wie mach ich das? Muss ich da im
    PHP-Code:
    mysql_query("SELECT * ... "
    irngedwo die Codierung angeben?

    Danke für weitere Vorschläge & lieber Gruss
    Euer Pinky
     

  6. #6
    Pinky Pinky ist offline Mitglied Gold
    Registriert seit
    Aug 2003
    Beiträge
    161
    Ich habe zwischenzeitlich noch etwas rumprobiert. So hab ich z.B. folgende Codes getestet:

    PHP-Code:
    $value mb_convert_encoding($value"ISO-8859-1"mb_detect_encoding($value"UTF-8, ISO-8859-1"true)); 
    und

    PHP-Code:
    $value iconv('UTF-8''ISO-8859-1//TRANSLIT//IGNORE'$value); 
    Leider blieben auch diese beide erfolglos.

    Danke für jede weitere Anmerkung.

    Lieber Gruss
    Euer Pinky
     

  7. #7
    Bullja Bullja ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    74
    Blog-Einträge
    1
    Hallo Pinky,
    exportierst Du die MYSQL-Daten in ein CSV-File? Excel hat bei bei einem meiner Exports die BOM benötigt. Vielleicht hilft es?
    PHP-Code:
    fwrite($tempb"\xEF\xBB\xBF"); //write BOM 
    In meinem Code wurde die BOM in eine Datei geschrieben, Du musst es eben "echoen".

    Viele Grüße
     
    Bullja | marsal.biz

  8. #8
    Pinky Pinky ist offline Mitglied Gold
    Registriert seit
    Aug 2003
    Beiträge
    161
    Hallo,

    danke für die Antwort. Ich versteh nicht ganz, was du damit meinst, dass ich es eben "echoen" muss (also ich weiss, was du damit meinst, aber ich weiss nicht, wie ich es machen muss .

    Ich weiss eben nicht, ob ich dem System vorgaukle, ein .XLS zu erstellen, in Wahrheit aber ein .CSV erstellt wird.

    Mein Code zum erstellen des Scripts ist folgender. Wo muss ich nun den BOM einbauen? Die Funktion fwrite() kann ich ja schlecht verwenden...!

    PHP-Code:
    <?
        header
    ("Content-type: application/vnd-ms-excel"); 
        
    header("Content-Disposition: attachment; filename=".$_GET[cat].".xls");
        
    header("Pragma: no-cache");
        
    header("Expires: 0");

        
    $res mysql_query("SELECT * FROM `datenbank`");

        
    $db_felder = array( "name" "vorname");
        
    $num count($db_felder);

        for (
    $i=0$i<$num$i++)
            { 
    $header .= ucfirst($db_felder[$i]) . "\t"; }

        echo 
    $header."\n";

        while(
    $row mysql_fetch_array($res))
        {

            
    $line '';

                foreach(
    $db_felder as $value)
                {
                    if ((!isset(
    $value)) OR ($value == ""))
                    {
                        
    $value "\t";
                    }
                    
                    else
                    { 
                        
    $value $row[$value];                    
                        
    $value str_replace('"' '""' $value);
                        
    $value '"' $value '"' "\t"
                    }
                    
                    
    $line .= $value
                }

            
    $data .= trim($line)."\n"
        }

        
    $data str_replace("\r","",$data);
        
        if (
    $data == "")
        {
            
    $data "\n(0) Keine Datenätze gefunden!\n";
        }

        print 
    "$headern$data";
    ?>
    Herzlichen Dank & lieber Gruss
    Euer Pinky
    Geändert von Pinky (18.06.10 um 11:09 Uhr)
     

  9. #9
    Bullja Bullja ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    74
    Blog-Einträge
    1
    Die BOM liegt in den ersten drei Byte einer Datei, bei Dir muss es also vor dem Tabellenkopf ausgegeben werden:
    PHP-Code:
    echo b"\xEF\xBB\xBF";
    echo 
    $header."\n"
    Bei der Schreibweise bin ich mir nicht sicher, es scheint Versionsabhängig zu sein. Ich empfehle Dir außerdem mal den Befehl fputcsv anzuschauen, mit welchem Du Daten ins CSV-Format wandeln kannst. Übrigens sollte die Dateiendung, nicht *.xls sondern *.csv sein, denn XLS sind Binärdaten.
     
    Bullja | marsal.biz

  10. #10
    Avatar von EvilO
    EvilO EvilO ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Ort
    Wuppertal (NRW)
    Beiträge
    172
    Hi,

    der Content-Encoding header und die BOM haben überhaupt keinen Einfluss auf Excel-Dateien, da diese ein Binärformat sind, und Header und BOM nur für Textformate gelten.

    Außerdem erscheint mir die Ausgabe, die du erzeugst eher CSV oder TSV oder etwas ähnliches zu sein, in dem Fall wäre der Content-Type header definitiv nicht richtig.
     
    "Die Deutsche Rechtschreibung ist Freeware, dass heisst jeder kann sie benutzen wann er will, ohne dafür zu zahlen. Sie ist aber nicht Open Source, also darf sie ohne Zustimmung der Entwickler nicht verändert und weiterverbreitet werden."

  11. #11
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,
    zusätzlich zu den von EvilO gemachten Anmerkungen betreffs CSV:

    Excel lässt sich lt. meiner Erfahrung keinen Zeichensatz aufzwingen, ASCII dürfte da der kleinste gemeinsame Nenner sein.

    Ich würde dort also auf UTF8 verzichten, und die Daten generell nach Latin1 oder CP1252 umwandeln, damit sollte Excel klarkommen.
     

Ähnliche Themen

  1. Daten aus MySQL zeigen Umlaute falsch
    Von DarkRaver im Forum PHP
    Antworten: 0
    Letzter Beitrag: 08.11.10, 18:55
  2. Export einer Csv Datei aus Excel mittels VBA
    Von KeinName im Forum Visual Basic 6.0
    Antworten: 0
    Letzter Beitrag: 08.05.07, 14:37
  3. Access - export von Daten nach Excel
    Von rockabillyjimmy im Forum Office-Anwendungen
    Antworten: 1
    Letzter Beitrag: 18.05.05, 08:49
  4. Mysql in Excel exportieren (Umlaute beibehalten, wie geht das)
    Von Kai-Behncke im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 29.04.05, 16:16
  5. Export von Abfragedaten aus MySQL nach Excel
    Von grillmeister im Forum Relationale Datenbanksysteme
    Antworten: 7
    Letzter Beitrag: 19.03.05, 09:37