Whitesnake: Aus Müller wird Müller beim Eintrag in Datenbank

Der Titel sagt schon das Problem. Umlaute und scharfe ß werden in einen sehr interessanten Zeichensatz in die Datenbank eingetragen. Wie kann ich das abfangen, liegts am php oder liegts an der Einstellung der Datenbanktabelle?

  1. Hi,

    Der Titel sagt schon das Problem. Umlaute und scharfe ß werden in einen sehr interessanten Zeichensatz in die Datenbank eingetragen.

    Es liegt daran, dass ein Teil des (Betriebs-)Systems den Zeichensatz auf Unicode bzw. UTF-8 umgestellt hat (www.unicode.org), ein anderer Teil - oder der Client - noch nicht.

    Zum Abfangen kann ich Dir leider keinen Tip geben - ich habe meine Systeme allesamt wieder von UTF-8 auf "C" (ISO-8859-1) zurueckgesetzt, weil ich einfach zuviele Anwemndungen habe, die sich da noch verschlucken.

    Gruss aus Lausanne,

    • Joerg
  2. Hallo Whitesnake,

    Der Titel sagt schon das Problem. Umlaute und scharfe ß werden in einen sehr interessanten Zeichensatz in die Datenbank eingetragen. Wie kann ich das abfangen, liegts am php oder liegts an der Einstellung der Datenbanktabelle?

    Am Zeichensatz deines HTML-Dokuments und/oder an dem ausgesendeten Zeichensatz deines Servers. PHP will ISO-8859-1 haben, und MySQL kommt damit auch zurecht.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Moin!

      Erst beim Eintrag in die Datenbank oder schon vorher?

      Eventuell hilft Dir, neben der richtigen Einstellung des Zeichensatzes für das Formular und die Datenbank, auch

      utf8_decode
      oder
      utf8_encode

      Mit welchem Browser hast Du das getestet?

      Ich glaube mich daran zu erinnern, irgendwo gelesen zu haben, dass der Firefox aus Formularen trotz explizit eingestellten UTF8 ISO8859-1 senden soll.

      Möglicherweise hast Du auch gar kein echtes Problem, sondern die Software, die die Anzeige vornimmt, ist auf einen anderen Zeichensatz eingestellt, als das Vierquadrat aus Browser, Webserver, PHP und MySQL zum Browser(?) zurücksenden möchte.

      Um also nähere Hilfe geben zu können müssten wir schon wissen:

      • Welchen Zeichensatz vereinbarst Du im HTTP-Header mit dem Browser?
      • Welcher Zeichensatz steht im Content-Type des HTML- Dokumentes?
      • Welcher Zeichensatz steht als Angabe im Formular-Tag?
      • Welcher Zeichesatz ist bei der Datenbank eingestellt?
      • Welchen Zeichensatz erwartet die Software, mit der Du das Problem "gesehen" hast?

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
      1. Hallo fastix®,

        Um also nähere Hilfe geben zu können müssten wir schon wissen:

        • Welchen Zeichensatz vereinbarst Du im HTTP-Header mit dem Browser?
        • Welcher Zeichensatz steht im Content-Type des HTML- Dokumentes?
        • Welcher Zeichensatz steht als Angabe im Formular-Tag?
        • Welcher Zeichesatz ist bei der Datenbank eingestellt?
        • Welchen Zeichensatz erwartet die Software, mit der Du das Problem "gesehen" hast?

        Ist das Ganze an mich gerichtet, oder ist Whitesnake damit gemeint? ;-)

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        http://emmanuel.dammerer.at/selfcode.html
        1. Moin!

          Hallo fastix®,
          Ist das Ganze an mich gerichtet, oder ist Whitesnake damit gemeint? ;-)

          Ja. Sorry. Ging natürlich an Whitesnake. Da der aber sich aber als Fragender sicher den ganzen Thread "reinzieht" kann ich bestimmt darauf verzichten mittles C&P zu dublizieren.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
      2. Hallo,

        Möglicherweise hast Du auch gar kein echtes Problem, sondern die Software, die die Anzeige vornimmt, ist auf einen anderen Zeichensatz eingestellt, als das Vierquadrat aus Browser, Webserver, PHP und MySQL zum Browser(?) zurücksenden möchte.

        Webserver, PHP und MySQL sind hier wahrscheinlich nicht verantwortlich.
        Wahrscheinlich sendet ein Browser UTF-8-kodierte Formulardaten, die PHP dann als Oktetts direkt in die Datenbank schaufelt. Wird die Datenbank abgefragt und werden die Oktetts in ein ISO-8859-1-kodiertes HTML-Dokument geschrieben, kommt »Müller« heraus.

        Um also nähere Hilfe geben zu können müssten wir schon wissen:

        • Welchen Zeichensatz vereinbarst Du im HTTP-Header mit dem Browser?
        • Welcher Zeichensatz steht im Content-Type des HTML- Dokumentes?
        • Welcher Zeichensatz steht als Angabe im Formular-Tag?
        • Welcher Zeichesatz ist bei der Datenbank eingestellt?
        • Welchen Zeichensatz erwartet die Software, mit der Du das Problem "gesehen" hast?

        »Müller« kommt heraus, wenn die UTF-8-Bytesequenz, die den Text »Müller« repräsentiert, als ISO 8859-1 dekodiert wird.
        Es ist ziemlich wahrscheinlich, dass

        • in der Datenbank sieben Bytes gespeichert sind, also UTF-8;
        • der Browser von ISO 8859-1 ausgeht;
        • der Webserver, MySQL und PHP damit nichts zu tun haben, sie verarbeiten nur Oktetts und scheren sich nicht um die Kodierung;
        • MySQL erst ins Spiel kommt, wenn bestimmte Internationalisierungs-Funktionen von Version 4.1 aktiviert sind.

        Tatsächlich würde ich, wie du sagst, den Fehler bei der Kodierung des HTML-Dokuments bzw. beim accept-charset-Attribut eines möglichen Formulars suchen.

        Im Übrigen ist es natürlich sinnvoll, generell UTF-8 zu verwenden, denn wenn man accept-charset="iso-8859-1" notiert, senden einige Browser Fragezeichen für eingegebene Zeichen außerhalb von ISO 8859-1, andere senden numerische Zeichenreferenzen, die man absolut ungerne in der Datenbank stehen haben will.

        Mathias

  3. Hallo Whitesnake,

    niemand kann mit Bestimmtheit sagen an welcher Stelle in deinem System die Umlaute verfälscht werden, aber dass es ein Zeichensatz Problem ist ist klar. In der Regel ist es die letzte _anzeigende_ Instanz, die soetwas verursacht.

    Du solltest erstmal den Weg der Daten Schritt für Schritt verfolgen und an jedem Checkpoint überprüfen, ob die Bytes irgendwo umgeschrieben wurden. Das kannst du z.B. mit einem Hex-Editor machen. Das ü z.B. müsste die Byte Nr. 129 haben (laut ascii tabelle). Der kritischste Punkt ist, ob der Browser den du verwedest das ü auch mit dem richtigen Byte übermittelt.
    Wenn das Byte durchweg in Ordnung ist, wovon ich eigentlich ausgehe, dann ist das Problem nur ein visueller Fehler den vielleicht dein Shell-Client oder womit du auch in die Datenbank geschaut hast durch einen falschen Zeichensatz bereitet.

    Gruß,
    Cruz

  4. echo $begrüßung;

    Neben den anderen Hinweisen möchte ich hier noch auf diesen Artikel hinweisen, der sich ebenfalls mit der "BUMP"-Problematik (Browser, Unicode, MySQL und PHP) und beschäftigt:
    http://dev.mysql.com/tech-resources/articles/4.1/unicode.html

    echo "$verabschiedung $name";