klaus: Speichern von Umlauten

Hallo,

bisher hatte ich nie Schwierigkeiten, Texte mit deutschen Umlauten, die über ein Textarea eingegeben wurden, in der Tabelle zu speichern.
Merkwürdigerweise werden nun die deutschen Umlaute ö ä ü in der Tabelle als ö ä ü gespeichert.
Wieso wird der Text nicht Eins-zu-Eins gespeichert und wie kann ich das wieder geradebiegen?

Euer Klaus

  1. Hallo

    bisher hatte ich nie Schwierigkeiten, Texte mit deutschen Umlauten, die über ein Textarea eingegeben wurden, in der Tabelle zu speichern.
    Merkwürdigerweise werden nun die deutschen Umlaute ö ä ü in der Tabelle als ö ä ü gespeichert.
    Wieso wird der Text nicht Eins-zu-Eins gespeichert und wie kann ich das wieder geradebiegen?

    Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.

    Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.

    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!"
    Veranstaltungsdatenbank Vdb 0.3
    1. Hi,

      ergänzend:

      Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.

      Und im Idealfall heißt die Kodierung UTF.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hi!

        Und im Idealfall heißt die Kodierung UTF.

        Ach!
        +t

        Also insgesamt: UTF-8.

        Und das was da im OP zu lesen war (ö ä ü) sind UTF-8-kodierte Umlaute, die aber als ISO-8859-1 gelesen wurden und nicht als UTF-8.

        Lo!

        1. Hi,

          Und im Idealfall heißt die Kodierung UTF.
          Also insgesamt: UTF-8.

          meistens. Wenn mal UTF-16 draus wird, weil einfach der überwiegende Teil der Zeichen außerhalb von ASCII liegt, ist das aber auch nicht schlimm :-)

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
    2. Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.

      Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.

      Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können. Ebenso bei der Tabelle. Das Charset der Tabelle entspricht auch dem Charset aller anderen knapp Tabellen.

      Der einzige Unterschied besteht darin, dass ich das Formular wiederum über Ajax anzeigen lasse. In diesem Script werden keine Angaben bezüglich irgendwas gemacht, da ja Styles, Charset und Datenbank-Verbindungen ja eigentlich schon festgelegt sind.

      Kann nicht nicht die "falschen" Umlaute wieder korrigieren und dann wegspeichern? Ist vielleicht nur ein Workaround, würde mir aber schon reichen.

      Klaus

      1. Hi,

        Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.

        der Header ist irrelevant, wenn die Datei von Deinem Editor in einem anderen Encoding abgespeichert wurde.

        Kann nicht nicht die "falschen" Umlaute wieder korrigieren und dann wegspeichern?

        Wie soll denn bitte "falsch" erkannt werden? Die Zeichen sind doch da, es ist alles korrekt. Dass es nicht diejenigen Zeichen sind, die Du gerne hättest, kann kein Programm riechen. Aber wenn Du magst, kannst Du in der Datenbank ja per UPDATE-Statement Ersetzungen vornehmen - nur nützt Dir das exakt gar nichts, wenn Du nicht das eigentliche Problem löst, denn dann wird bei nächster Gelegenheit wieder Schwachsinn in die DB geschrieben.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      2. Hallo

        Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.

        Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.

        Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.

        Ich meine nicht die meta-Angabe im Dokument! prüfe in deinem Editor, mit welchem Charset die HTML-Vorlagen und die Skripte gespeichert werden. Idealerweise -- wenn auch nicht zwingend -- ist das UTF-8. Der Webserver deines Hosters muss das natürlich auch so ausliefern können.

        Ebenso bei der Tabelle. Das Charset der Tabelle entspricht auch dem Charset aller anderen knapp Tabellen.

        Wenn wir davon ausgehen, dass UTF-8 für die Skripte und HTML-Quelltexte verwendet wird (das gilt analog auch für einen anderen Charset), sollten Tabellen und Felder, die Text aufnehmen, ebenfalls die UTF-8-Codierung verwenden. Zusätzlich gibst du bei der Verbindungsaufnahme mit dem DB-Server UTF-8 als zu verwendendem Charset vor. Ich mache das immer (innerhalb einer Funktion) mit einem allerersten Query, den ich direkt nach erfolgter Verbindungsaufnahme absetze.

        function auge_connect_dbserver($db) {  
        $s = mysql_connect($db["host"],$db["user"],$db["pass"]);  
        $t = mysql_select_db($db["dbase"],$s);  
        if ($s===false or $t===false) {  
           return false;  
        } else {  
           # UTF-8 erzwingen  
           $q = "SET NAMES utf8";  
           $a = mysql_query($q,$s);  
           if ($a===false) {  
              return false;  
           } else {  
              return $s;  
           }  
        }  
        } # Ende: auge_connect_dbserver
        

        Die Verbindung wird aufgebaut und mit SET NAMES utf8 wird als erstes der Charset der verbindung erzwungen. Klappt irgendwas nicht, dann gibt die Funktion false zurück, ansonsten die Kennung der Verbindung.

        "Draußen" im Skript rufe ich diese Funktion auf, prüfe dann den Rückgabewert und lasse danach das Skript ablaufen oder eine Fehlermeldung ausgeben.

        <?php  
        // irgendwelche includes  
          
        $sql = auge_connect_dbserver($db);  
          
        if ($sql===false) {  
        // Fehlermeldung generieren  
        } else {  
        // Datenbankabfragen, Verarbeitung, Generierung der Ausgabe der Daten  
        }  
          
        // Ausgabe der generierten Daten bzw. der Fehlermeldung innerhalb eines HTML-Gerüsts  
        ?>
        

        Der einzige Unterschied besteht darin, dass ich das Formular wiederum über Ajax anzeigen lasse. In diesem Script werden keine Angaben bezüglich irgendwas gemacht, da ja Styles, Charset und Datenbank-Verbindungen ja eigentlich schon festgelegt sind.

        Auch und besonders(!) deine JavaScript-Skripte sollten UTF-8 als Charset verwenden, da bei Ajax, so es keine expliziten anderen Vorgaben gibt, automatisch von UTF-8 als Codierung ausgegangen wird.

        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!"
        Veranstaltungsdatenbank Vdb 0.3
      3. Hi!

        Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.

        Sagen wir mal "anderen" und dann besser Kodierung, auch wenn das oft als "charset" angegeben werden muss.

        Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.

        Gibst du auch bei den AJAX-Responses einen Content-Tape-Header mit charset an?

        Und schau bitte genauer hin, an welcher Stelle welche Kodierung vorliegt. Meine Glaskugel sagt mir, dass die per AJAX an PHP gesendeten Daten UTF-8-kodiert sind, du aber ISO-8859-1 annimmst. AJAX das UTF-8 abzugewöhnen, bekommt man zwar hin, wenn man die Daten vor dem Versenden mit escape() behandelt. Besser ist es, modern zu werden, das Problem gleich richtig anzupacken und generell UTF-8 zu verwenden. Allerdings ist das, wenn man solch eine Umstellung das erste Mal macht, mitunter frustrierend, weil man Stellen übersieht, an denen eine Kodierung ausgehandelt oder angegeben werden muss.

        Lo!

        1. Hallo,

          Content-Tape-Header

          das ist die Grifflasche am Ende des Bandes, das aus der Cassette herausragt?

          *scnr*
           Martin

          --
          Die letzten Worte der Challenger-Crew:
          Lasst doch mal die Frau ans Steuer!
        2. Hallo

          Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.

          Sagen wir mal "anderen" und dann besser Kodierung, auch wenn das oft als "charset" angegeben werden muss.

          Öhhm, ja. Hach, immer diese Unganauigkeiten.

          Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.

          Gibst du auch bei den AJAX-Responses einen Content-Tape-Header mit charset an?

          Und schau bitte genauer hin, an welcher Stelle welche Kodierung vorliegt. Meine Glaskugel sagt mir, dass die per AJAX an PHP gesendeten Daten UTF-8-kodiert sind, du aber ISO-8859-1 annimmst.

          Als Tip für klaus:

          Benutze zur diesbezüglichen Prüfung den FF mit der Erweiterung Live HTTP Headers. Bei jedem Request an einen Webserver liefert die Erweiterung sämtliche hin-und-her-geschickten HTTP-Header betreffen. Somit kannst du alles, was den Weg zwischen Webserver und dir/deinem Browser betrifft, überwachen.

          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!"
          Veranstaltungsdatenbank Vdb 0.3