[PHP/MySQL] UTF-8 spackt rum?!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [PHP/MySQL] UTF-8 spackt rum?!

    Moinsen.

    Es geht um folgendes: Die Zeichenkodierung bei meinem PHP und MySQL will nicht so richtig, habe mich auch schon auf diversen Seiten im Internet darüber schlau gemacht, aber überall steht die gleiche Lösung und die will bei mir nicht so richtig.
    Ich möchte, dass Umlaute wie ä,ü,ö,ß in meiner Datenbank richtig gespeichert werden sowie das Absenden eines Textes für eine Email mit den richtigen Zeichen angezeigt wird.

    Zu meiner Datenbank:
    Die Koallition der Datenbank ist ganz normal latin1_swedish_ci (Nichts verändert)
    Bei meinen Tupel username, password und email habe ich varchar 255 utf8_unicode_ci stehen.
    Nach dem Verbindungsaufbau zur Datenbank habe ich zusätzlich noch mysql_query("SET NAMES 'utf8'"); eingetragen.
    Als Header habe ich in jedem PHP Dokument noch header("Content-type:text/html; charset=utf-8"); geschrieben und zu guter letzt:
    mail($email[$i], 'Betreffzeile', utf8_encode($nachricht), $header); habe ich meine Nachricht nochmal in utf8_encode reingepackt.
    Die Zeichenkodierung von meinem HTML ist ebenfalls auf UTF-8 eingestellt. Was allerdings dabei am Ende rauskommt sind lauter komischer Zeichen!
    Habe ich da einen Denkfehler drin oder irgendwas übersehen?

    Liebe Grüße
    icqgamer
  • Versuche erstmal anstatt utf8_encode($nachricht) in htmlentities($nachricht) umzuwandeln. Das sollte fürs erste genügen, ist aber kein UTF-8. Eigentlich solltest du alle Konvertierungen unterlassen, außer dem Header für das charset. Was aber falsch ist, ist die Koallition der Datenbank. Diese musst du auf utf8_general_ci umstellen. Dann sollte alles funktionieren.
    Etwas was mich noch sehr stutzig macht ist die Methode wie du Passwörter abspeicherst. Du darfst niemals Passwörter im Klartext abspeichern. Ich weiss nicht ob dies der Fall ist, aber bitte benutze eine sichere Hash Funktionen mit Salt.

  • Danke, werd ich mal probieren. Die Passwörter speichere ich mit einer md5-Verschlüsslung.

    Okay.. ich hänge mal Bilder ran..

    Datensätze (einmal nur mit Header ohne encode_utf8 und einmal mit deinem Vorschlag)




    Die Attribute


    Die Tabellenoptionen


    Reicht es vielleicht nicht im Header die Kodierung anzugeben + die Datenbank dementsprechend zu konfigurieren?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von icqgamer ()

  • Wenn du MD5 als Verschlüsselung bezeichnest solltest du vieleicht lieber die Finger vom Passwörter speichern lassen.

    Wenn du es unbedingt machen musst, dann informiere dich, wie auch schon Chris987 gesagt hat, über sichere Hash Funktionen mit Salt.
  • andre111 schrieb:

    Wenn du MD5 als Verschlüsselung bezeichnest solltest du vieleicht lieber die Finger vom Passwörter speichern lassen.

    Wenn du es unbedingt machen musst, dann informiere dich, wie auch schon Chris987 gesagt hat, über sichere Hash Funktionen mit Salt.


    Hallo, um die Passwörter geht es hier momentan nicht und für meine Zwecke reicht es vollkommen aus. Tut mir Leid, wenn das jetzt böse rüberkommt, aber es ist mir überlassen wie ich was verschlüssle und wenn es dir nicht passt, dann ignoriere es einfach. Ich weiß schon was ich tue.
  • Wenn der Zeichensatz in MySQL und HTML stimmt, sollte es doch relativ leicht fallen, den Übeltäter einzugrenzen.

    Hatte hier gerade ein ähnliches Problem, der Zeichensatz in der Datenbank hat gestimmt, konnte ich via MySQL Workbench bestätigen. HTML hatte auch so schon Umlaute und Sonderzeichen drinnen, auch nicht der Übeltäter.

    Kurzerhand mittels phpinfo(); bemerkt, dass scheinbar ein letztes Update meine php.ini Datei überschrieben hat und somit kein default_charset angegeben war. (default_charset = "utf-8") Hinzu kam dann noch, dass ich explizit angeben musste, dass mein mysqli_connect Objekt ein wenig Nachhilfe mittels
    $this->db->set_charset("utf8"); //mysqli_connect Objekt

    brauchte.

    Edit:
    Als Header habe ich in jedem PHP Dokument noch header("Content-type:text/html; charset=utf-8");

    zwar in die richtige Richtung gedacht, bringt aber nix, da das lediglich der Browser interpretiert. Dazwischen ist ja noch mal der PHP-Interpreter, der andere Anweisungen benötigt.
  • Ich hoffe, dass ich das nicht überlesen habe, aber ich hatte vergleichbare Probleme und die Lösung war, dass die PHP Datei nicht richtig gespeichert wurde. Wenn die Datei nicht als "UTF-8 ohne BOM" gespeichert werden, kann es immer wieder zu Problemen kommen, egal was man sonst noch anstellt.
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Peter Mortensen schrieb:

    • There is no official difference between UTF-8 and BOM-ed UTF-8
    • A BOM-ed UTF-8 string will start with the three following bytes. EF BB BF
    • Those bytes, if present, must be ignored when extracting the string from the file/stream.
    But, as additional information to this, the BOM for UTF-8 could be a
    good way to "smell" if a string was encoded in UTF-8... Or it could be a
    legitimate string in any other encoding...

    via stackoverflow

    Daraus schlussfolgere ich, dass in deinem Fall der Interpreter utf-8 als nicht-utf-8 interpretiert und sich selbst einen Zeichensatz ausgesucht hat. Der Text/Die Datei im UTF-8 mit/ohne BOM ist gleich.