Zeichensatzproblem bei eMails

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zeichensatzproblem bei eMails

    Hallo!

    Ich habe folgendes Problem: Es wird durch ein Script ein html-Code in eine MySQL-Tabelle eingetragen. Später möchte ich diesen html-Code auslesen und per eMail versenden - das klappt soweit, aber leider werden Umlaute durch Fragezeichen ersetzt.

    Der Zeichensatz meiner Seite lautet ISO-8859-1. Das Feld in der Datenbank, in das ich den html-Code eintrage, hat den Zeichensatz "latin1_german1_ci". Im Script, das den html-Code dann per mail() verschickt steht im Header ebenfalls "ISO-8859-1" drinnen.

    ABER: wenn ich nun den Wert des Datenbankfeldes (html-Code) in eine Variable lese und per mb_detect_encoding den Zeichensatz ausgeben lasse, erhalte ich "UTF-8". Merkwürdig.

    Wenn ich dann diese Variable per utf8_decode() umwandle, erhalte ich als Zeichensatz "ASCII". Die Mails sehen leider noch immer nicht besser aus.

    Hat jemand eine Idee, was ich hier falsch mache?

    Danke!

  • #2
    Alles was ich bisher über Umlautprobleme las, dass die Ursachen sich meistens nicht leicht zu erkennen geben. Es beginnt damit, dass eine HTML-Seite nicht nur mit einem Zeichensatz ausgezeichnet wird, sondern unter diesem Zeichensatz auch abgespeichert und notfalls vorher konvertiert werden muss. Wenn die Eingaben mit einem Formular erfolgen, wovon ich mal ausgehe, kann im Form-Tag der Zeichensatz ebenfalls ausgewiesen werden:
    HTML-Code:
    <form name="..." action="..." accept-charset="iso-8859-1">
    Du kannst da nur schrittweise vorgehen und schauen, ab wo was schief läuft.
    Zuletzt geändert von Melewo; 20.03.2013, 18:52.

    Kommentar


    • #3
      Zitat von freakgesicht Beitrag anzeigen
      Das Feld in der Datenbank, in das ich den html-Code eintrage, hat den Zeichensatz "latin1_german1_ci".
      Das ist kein Zeichensatz, sondern eine Kollation.

      Zitat von freakgesicht Beitrag anzeigen
      Im Script, das den html-Code dann per mail() verschickt steht im Header ebenfalls "ISO-8859-1" drinnen.
      Verwende nicht mail(), sondern einen Mailer wie zB. PHPMailer.

      Zitat von freakgesicht Beitrag anzeigen
      ABER: wenn ich nun den Wert des Datenbankfeldes (html-Code) in eine Variable lese und per mb_detect_encoding den Zeichensatz ausgeben lasse, erhalte ich "UTF-8". Merkwürdig.
      Auf welchen Zeichensatz ist deine Datenbankverbindung gesetzt?

      Kommentar


      • #4
        @Melewo

        Danke für deine Antwort - ich werde mir das genau ansehen.

        @h3ll

        Ach ja stimmt - das ist die Kollation. Hat diese irgendeinen Effekt? Kann ich einen Zeichensatz für eine MySQL-Tabelle bzw. eine Datenbank setzen?

        Bezüglich Zeichensatz MySQL-Verbindung: Ich habe ehrlich gesagt noch nie davon etwas gehört, dass man hier einen Zeichensatz angeben kann. Zur Zeit verwende ich ein normales mysql_connect() und mysql_select_db() ohne eine besondere Angabe. Was muss ich hier definieren?

        Danke für deine Hilfe!

        Ich weiß nicht genau, wie wichtig das ist, aber in dem gleichen Script, in dem ich den html-Code in die Tabelle speichere, versende ich auch das eMail direkt an eine Mailadresse und dabei kommen die Mails korrekt dargestellt an. Also liegt es anscheinend an der Verwendung des Datenbank-Eintrags.

        Weiters fällt mir noch ein zu erwähnen, dass wenn ich den html-Code in PHPMyAdmin in der Tabelle ansehe, alle Zeichen korrekt dargestellt werden. Vermutlich ist das aber nicht relevant, oder?
        Zuletzt geändert von freakgesicht; 20.03.2013, 20:35.

        Kommentar


        • #5
          Zitat von freakgesicht Beitrag anzeigen
          Ach ja stimmt - das ist die Kollation. Hat diese irgendeinen Effekt?
          zB. auf die Sortierung und Vergleiche. Aber genaueres sagt dir das MySQL-Handbuch.

          Zitat von freakgesicht Beitrag anzeigen
          Kann ich einen Zeichensatz für eine MySQL-Tabelle bzw. eine Datenbank setzen?
          Ja, kann man. Das hat aber keinen Einfluss auf die Zeichenkodierung der Datenbankverbindung.

          Zitat von freakgesicht Beitrag anzeigen
          Bezüglich Zeichensatz MySQL-Verbindung: Ich habe ehrlich gesagt noch nie davon etwas gehört, dass man hier einen Zeichensatz angeben kann. Zur Zeit verwende ich ein normales mysql_connect() und mysql_select_db() ohne eine besondere Angabe. Was muss ich hier definieren?
          PHP: mysql_set_charset - Manual

          Die mysql-Extension ist übrigens veraltet. Bei modernen PHP-Installationen ist sie nicht automatisch vorinstalliert und in zukünftigen PHP-Versionen wird sie irgendwann ganz entfernt. Wenn du also willst, dass dein Script etwas länger laufen sollen, solltest du auf eine modernere Extension wie mysqli oder PDO umstellen.

          Kommentar


          • #6
            Vielen Dank für deine schnellen Antworten, h3ll!

            Ich möchte mal vorerst mysql_set_charset() versuchen, um zu sehen, wo der Fehler liegt, aber danke für den Hinweis, dass die Funktion veraltet ist.

            Wenn ich nun als Seitenkodierung ISO-8859-1 verwende - muss ich dann mittels mysql_set_charset() den Wert auf "ISO-8859-1" stellen? oder auf "latin1_german1_ci"?

            Danke!

            Kommentar


            • #7
              Zitat von freakgesicht Beitrag anzeigen
              Wenn ich nun als Seitenkodierung ISO-8859-1 verwende - muss ich dann mittels mysql_set_charset() den Wert auf "ISO-8859-1" stellen? oder auf "latin1_german1_ci"?
              latin1_german1_ci ist eine Kollation und keine Zeichenkodierung. Hatte ich bereits gesagt.

              MySQL kann kein ISO-8859-1. Es gibt die Zeichenkodierung "latin1" die CP-1252 entspricht. Diese ist annähernd gleich zu ISO-8859-1, wenn auch nicht 100% identisch. Mit dieser wirst du wahrscheinlich auskommen.

              Ich würde allerdings empfehlen alles komplett auf UTF-8 umzustellen.

              Kommentar


              • #8
                Okay, danke h3ll!

                Ich habe es nun auf "latin1" gestellt. Leider hat sich nichts geändert - die Mails sehen aus wie vorher und wenn ich mittels mb_detect_encoding den Zeichensatz der Mail-Nachricht auslese, erhalte ich immer noch "UTF-8".

                Bleibt mir nichts anderes übrig, als ganz auf UTF-8 umzustellen?

                Bis jetzt habe ich es nur mit mail() versucht - funktioniert das bestimmt nicht?

                Nur mal rein theoretisch: Wenn ich nun per mb_detect_encoding das Ergebnis "UTF-8" erhalte - kann ich nicht einfach damit weiter arbeiten? Was ist das Problem daran, dass ich nicht einfach eine eMail mit UTF-8-encoding versenden kann?

                Danke für deine Hilfe, h3ll!!!

                Kommentar


                • #9
                  Zitat von freakgesicht Beitrag anzeigen
                  Ich habe es nun auf "latin1" gestellt. Leider hat sich nichts geändert - die Mails sehen aus wie vorher und wenn ich mittels mb_detect_encoding den Zeichensatz der Mail-Nachricht auslese, erhalte ich immer noch "UTF-8".
                  Dann hast du es nicht richtig umgestellt. Prüfe kurz vor der Datenbankabfrage mit PHP: mysql_client_encoding - Manual ob auch wirklich die richtige Zeichenkodierung gesetzt ist.

                  Zitat von freakgesicht Beitrag anzeigen
                  Nur mal rein theoretisch: Wenn ich nun per mb_detect_encoding das Ergebnis "UTF-8" erhalte - kann ich nicht einfach damit weiter arbeiten? Was ist das Problem daran, dass ich nicht einfach eine eMail mit UTF-8-encoding versenden kann?
                  Kannst du doch. Nur musst du es im Mail-Header auch angeben.

                  Du solltest auch überprüfen, ob die Daten in der Datenbank auch wirklich korrekt sind. Dies geht zB. mit phpMyAdmin. Damit müssen alle Zeichen korrekt dargestellt werden, ansonsten hast du Zeichenmüll in der Datenbank.

                  Kommentar


                  • #10
                    Noch eine Frage: Muss ich im html-Code der eMail ein charset angeben? Also mittels meta-equiv...?

                    Kommentar


                    • #11
                      Zitat von freakgesicht Beitrag anzeigen
                      Noch eine Frage: Muss ich im html-Code der eMail ein charset angeben? Also mittels meta-equiv...?
                      Nein, das ist nicht notwendig.

                      Kommentar


                      • #12
                        Kaum zu glauben: wenn ich vor dem Query, das den html-Code ausliest, mir mittels mysql_client_encoding() den Zeichensatz ausgeben lasse, erhalte ich "latin1".

                        Dann kommt das Query > dann speichere ich mir mittels mysql_fetch_array den html-Code in die Variable $message und lasse mir mittels mb_detect_encoding($message) den Zeichensatz ausgeben > dort steht "UTF-8".

                        Das mysql_set_charset() habe ich in jener Datei gesetzt, die die Verbindung zu MySQL herstellt - sollte also überall verfügbar sein.

                        Kommentar


                        • #13
                          Dann funkt dir irgendwas dazwischen. Ohne den Code zu sehen, könnte man nur raten.

                          Kommentar


                          • #14
                            Ja, anscheinend... Hmm, beim Code gibt's nicht viel zu sehen, also:

                            PHP-Code:
                            echo "test: ",mysql_client_encoding(),"<br>";

                            $select_mail "SELECT message FROM mails WHERE id = '$id'";
                            $result mysql_query($select_mail);

                            while (
                            $row mysql_fetch_array($result))
                            {
                              
                            $message $row['message'];
                            }

                            echo 
                            "encoding: ",mb_detect_encoding($message),"<br>"
                            Wie gesagt bekomme ich als Ergebnis:
                            test: latin1
                            encoding: UTF-8

                            Okay, angenommen ich verwende die Variable als UTF-8: Dann gebe ich im Mail-Header einfach an:
                            $header = 'Content-type: text/html; charset=UTF-8'.'\r\n'; ?

                            Kommentar


                            • #15
                              P.S.

                              Momentan verwende ich den Header genau so wie gerade gepostet, nur mit "ISO-8859-1", also:

                              $header = 'Content-type: text/html; charset=ISO-8859-1'.'\r\n';

                              Kommentar

                              Lädt...
                              X