Malcolm Beck´s: UTF 8, alles durcheinander

hi,

ich hab schon einiges zu diesem Thema gefunden, dass bringt mich aber alles nicht weiter.

Ich fang mal bei der Dateneingabe an:

Ich hab eine PHP Seite über die ich meine Daten in die Datenbank schreibe, diese PHP-Seite ist UTF 8 Kodiert, wird auch laut Response Headers als UTF 8 an den Browser übermittelt.

Die Kollation der Datenbank selbst und alle enthaltenen Tabellen sowie Felder sind auf utf8_unicode_ci eingestellt, dennoch werden Sonderzeichen in der Form „ü“ gespeichert, warum?

Dann habe ich zu testzwecken die Sonderzeichen direkt über phpMyAdmin geändert und in ihrer richtigen Form (ü) eingetragen, nur dann wird, wenn ich mir die Daten wieder auf meiner PHP Seite anzeigen lasse, die Sonderzeichen als „?“ dargestellt, was läuft denn hier so gewaltig schief?

Selbst wenn ich die Sonderzeichen in ihrer Richtigen Form in der DB habe, werden sie auf dem Browser nicht richtig dargestellt, obwohl _alles_ in UTF 8 kodiert ist, was mache ich falsch?

xampp, phpMyAdmin - 2.11.3, MySQL-Version: 5.0.51

Kind regards

--
I have a Dream...
Bugs erzeugen gegenbugs.
Wir müssen Bugs mit Bugs bekämpfen!
  1. Hallo

    Ich hab eine PHP Seite über die ich meine Daten in die Datenbank schreibe, diese PHP-Seite ist UTF 8 Kodiert, wird auch laut Response Headers als UTF 8 an den Browser übermittelt.

    Die Kollation der Datenbank selbst und alle enthaltenen Tabellen sowie Felder sind auf utf8_unicode_ci eingestellt, dennoch werden Sonderzeichen in der Form „ü“ gespeichert, warum?

    weil Du vermutlich der Datenbank (implizit) sagst, dass Latin-1 kommt. Implizit,  weil Du _nicht_ explizit UTF-8 vereinbarst.

    Selbst wenn ich die Sonderzeichen in ihrer Richtigen Form in der DB habe, werden sie auf dem Browser nicht richtig dargestellt, obwohl _alles_ in UTF 8 kodiert ist, was mache ich falsch?

    weil Du für die Verbindung (implizit) sagst, dass Latin-1 ankommt. Implizit, weil Du _nicht_ explizit UTF-8 vereinbarst und standardmäßig vermutlich Latin-1 verwendet wird.

    Absetzen der Anweisung

    [link:http://dev.mysql.com/doc/refman/5.0/en/charset-literal.html@title=SET NAMES UTF-8]

    (einmal je Verbindung) oder die Verwendung von

    - mysql_set_charset()
     - mysqli_set_charset()

    (beide ab PHP 5.2.3) sollte Abhilfe schaffen.

    Freundliche Grüße

    Vinzenz

    1. hi,

      [link:http://dev.mysql.com/doc/refman/5.0/en/charset-literal.html@title=SET NAMES UTF-8]
      (einmal je Verbindung) oder die Verwendung von

      Dieses SET NAMES hatte ich schon in mehrfacher Ausführung gefunden aber ich habe es bei mir einfach nicht einbauen können, ich wusste nicht wo es hinkommt.

      Ja, das war es, funktioniert jetzt wie gewünscht, sowohl in der Datenbank als auch bei der Ausgabe.

      Einfach unter

      $verbindung = mysql_connect("localhost", "admin", "123456");  
      mysql_set_charset('utf8',$verbindung);  
      // Fehlerbehandlung ...
      

      Bitte für das Archiv korrigieren, wenn Suboptimal.

      Danke für die Hilfe.

      Kind regards

      --
      I have a Dream...
      Bugs erzeugen gegenbugs.
      Wir müssen Bugs mit Bugs bekämpfen!
      1. Hallo Malcolm,

        $verbindung = mysql_connect("localhost", "admin", "123456");

        mysql_set_charset('utf8',$verbindung);
        // Fehlerbehandlung ...

        
        > Bitte für das Archiv korrigieren, wenn Suboptimal.  
          
        die Benutzung der veralteten mysql\_\*-Funktionen ist grundsätzlich suboptimal.  
        Verwende die verbesserte mysqli-Erweiterung oder PDO oder ...  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. hi Vinzenz,

          die Benutzung der veralteten mysql_*-Funktionen ist grundsätzlich suboptimal.
          Verwende die verbesserte mysqli-Erweiterung oder PDO oder ...

          Ich verwende ausschliesslich die mysql_*-Funktionen, was ich jetzt zu mysqli auf die schnelle gefunden habe ist diese Anleitung, dass wird wohl richtig sein oder?
          Ich höre zum ersten mal von mysqli.

          Kind regards

          --
          I have a Dream...
          Bugs erzeugen gegenbugs.
          Wir müssen Bugs mit Bugs bekämpfen!
          1. Hallo Malcolm,

            die Benutzung der veralteten mysql_*-Funktionen ist grundsätzlich suboptimal.
            Ich verwende ausschliesslich die mysql_*-Funktionen, was ich jetzt zu mysqli auf die schnelle gefunden habe ist diese Anleitung, dass wird wohl richtig sein oder?
            Ich höre zum ersten mal von mysqli.

            der wesentliche Punkt, der für die Verwendung von mysqli gegenüber den mysql_*-Funktionen spricht, ist, dass die veralteten mysql_*-Funktionen viele Neuerungen ab MySQL 4.1 gar nicht nutzen können.

            Freundliche Grüße

            Vinzenz

    2. Hallo Vinzenz,

      Wie ist das denn eigentlich wenn man mit PDO und MySQL DB arbeitet?

      Das gibt es doch vermutlich nicht was "mysql_set_charset" entspricht oder?

      vielen Dank und viele Grüße
      hawk

      1. Hallo,

        Wie ist das denn eigentlich wenn man mit PDO und MySQL DB arbeitet?
        Das gibt es doch vermutlich nicht was "mysql_set_charset" entspricht oder?

        PDO ist ein DB-Abstraktionslayer, der nicht MySQL-spezifisch ist.

        Setze daher

        SET NAMES 'UTF8'

        ab.

        Freundliche Grüße

        Vinzenz

        1. echo $begrüßung;

          SET NAMES 'UTF8'

          Übrigens, die Anführungszeichen sind nicht nötig, obwohl es im MySQL-Handbuch immer so notiert ist. SET NAMES utf8 (oder UTF8) reicht. Die Schreibweise mit Bindestrich ist hingegen unter MySQL kein zulässiger Wert.
          Eine passendere Handbuch-Seite für die Kodierung von Client-Verbindungen wäre: Connection Character Sets and Collations.

          [*] seltsamerweise bei SET CHARACTER SET nicht (SET CHARACTER SET sollte man aber nur dann verwenden, wenn man den Unterschied zu SET NAMES verstanden hat und wirklich haben möchte)

          echo "$verabschiedung $name";

    3. echo $begrüßung;

      [...] oder die Verwendung von

      (beide ab PHP 5.2.3) sollte Abhilfe schaffen.

      mysqli_set_charset() gibt es schon ewig (seit 5.0.5). Vermutlich hat dir nur dein Verlinkungsfehler einen Streich gespielt.

      echo "$verabschiedung $name";

      1. Hallo dedlfix,

        mysqli_set_charset() gibt es schon ewig (seit 5.0.5). Vermutlich hat dir nur dein Verlinkungsfehler einen Streich gespielt.

        ja, hat er. Und die fehlerhafte Suchfunktion der PHP-Doku, die mich trotz Eingabe von

        mysqli_set_charset

        zu

        mysql_set_charset

        führt und nicht zu

        http://www.php.net/manual/de/mysqli.set-charset.php

        Ich hab' mal einen Bug-Report eingestellt - und fühlte mich ganz gewaltig genervt. Bugs zu melden wird zum Hürdenlauf - so wie es hier auch mal war, nur viel viel schlimmer :-(

        Freundliche Grüße

        Vinzenz