Martin Klos: / PHP Zeichensatzprobleme!!!! (document.write)

Hallo,
ich muss eine grosse JavaScript Variable ( 10-50 kb Text) via PHP in einer mySQL Datenbank ablegen.
Da dies nur über ein Formular/POST möglich ist, übergebe ich die Variable einem Formular:

var previewHTML = "äöüÄÖÜ"
var leftPos = (screen.availWidth-780) / 2
var topPos = (screen.availHeight-580) / 2
previewWin = window.open('','','width=500,height=450,scrollbars=yes,resizable=yes,titlebar=0,top=' + topPos + ',left=' + leftPos);

previewWin.document.write("<form method="POST" action="myEditora.php" name="daten">")
previewWin.document.write("<textarea WARP="VIRTUAL" name="bez2" style="height:200px; width:450px">")
previewWin.document.write(previewHTML)
previewWin.document.write("</textarea>")
previewWin.document.write("<input type="submit" value="Senden" name="send_form">")
previewWin.document.write("</form>")

myEditora.php:
<?echo $bez2;?>

äöüÄÖÜ im Formular wird im neuen document zu: äöüÃÃÃ

schreibe ich direkt in das neue document (ohne Formular)
werden die Umlaute korrekt angezeigt.

was mache ich falsch?

viele Grüsse Martin Klos

  1. Hallo Martin,

    was mache ich falsch?

    Ah ja, die berühmten Zeichensätze. Das Problem ist wirklich saublöd... Es ist im Prinzip eine Clientseitige Sache. Ich will Dir hier mal den Ablauf beschreiben:

    Seite 1: Wird mit Content-Type: text/html; charset=ch1 an den Browser gesendet. (ch1 ist jetzt mal erfunden...)
    Der Browser schickt das Formular als ch1-kodiert zurück, jedoch teilt der das dem Server nicht mit, weil das nicht vorhergesehen ist.
    Die Seite 2 gibt mit einem anderen Charset (ch2) die Seite aus, aber nimmt immer noch die gleichen ASCII-Werte dafür. Daher stellt der Browser das falsch dar. Du hast 2 Möglichkeiten:

    1. (empfohlen) Du lieferst die erste Seite mit iso-8859-1 aus (was ja auch default bei PHP ist)
    2. Du lieferst die zweite (PHP) Seite mit dem Zeichensatz der ersten Seite aus

    Du kannst bei der ersten Seite, sofern Du die Auslieferung nicht Serverseitig beeinflussen kannst, einen <meta>-Tag verwenden:

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

    Siehe auch: http://selfhtml.teamone.de/html/kopfdaten/meta.htm#zeichensatz
    http://selfhtml.teamone.de/inter/index.htm

    Grüße,

    Christian

    --
    Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                          -- Albert Einstein
    1. Hallo

      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

      habe ich gemacht, aber die codierung steht für das mit window.print erzeugte document auf unicode. und ist nicht änderbar (hellgrau).
      egal welchen zeichensatz ich verwende.

      1. Hallo Martin,

        habe ich gemacht, aber die codierung steht für das mit window.print erzeugte document auf unicode. und ist nicht änderbar (hellgrau).
        egal welchen zeichensatz ich verwende.

        Sendest Du vielleicht irgendeinen HTTP-Header mit? Desweiteren: window.print? - was tut das hier zur Sache?

        Grüße,

        Christian

        --
        Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                              -- Albert Einstein
        1. Hallo,

          Sendest Du vielleicht irgendeinen HTTP-Header mit? Desweiteren: window.print? - was tut das hier zur Sache?

          upps das war einfach zu früh für mich (Gedankenfehler) :-)

          Der Fehler muss schon beim Erzeugen des neuen documents passieren.
          Ob ich den charset windows oder ISO nehme, ist egal. Das aufrufende Fenster steht auf charset="windows" das erzeugte document komischer weise auf Unicode und ist grau hinterlegt (IE 5.5 Ansicht/Codierung). Das Menü hat sich auch geändert. Jetzt kommt noch Links-nach-Rechts-Dokument. ???
          Vielleicht kannst Du den Code mal ausprobieren? Das Formular muss nicht abgeschickt werden. Wenn Du bei beiden Fenster die Codierung anschaust, wird der Fehler? hoffe ich klar. Leider habe ich nur den Internet Explorer.

          Viele Grüsse Martin Klos

          Ich poste nochmal den geänderten Code:

          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
          </head>
          <body>
          <script type="text/javascript" language="JavaScript">
          <!--

          var previewHTML = "äöüÄÖÜ"
          previewWin = window.open();

          previewWin.document.write("<html>")
          previewWin.document.write("<head>")
          previewWin.document.write("<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">")
          previewWin.document.write("</head>")
          previewWin.document.write("<form method="POST" action="myEditora.php" name="daten">")
          previewWin.document.write("<textarea WARP="VIRTUAL" name="bez2" style="height:200px; width:450px">")
          previewWin.document.write(previewHTML)
          previewWin.document.write("</textarea>")
          previewWin.document.write("<input type="submit" value="Senden" name="send_form">")
          previewWin.document.write("</form>")
          //-->
          </script>
          </body>
          </html>

          1. Hallo Martin,

            <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

            Verwende bitte keinen Windows-Character set und kodiere die Entities lieber. Im Internet solltest Du eigentlich nur Unicode und die ISO-Zeichensätze verwenden. (im westlichen Sprachraum) Ach ja: wenn Du unbedingt windows-1252 verwendest, dann muss die PHP-Datei das auch mitschicken.

            previewWin = window.open();

            previewWin.document.charset = 'iso-8859-1';

            Für den IE musst Du den Zeichensatz per JavaScript noch einmal extra setzen. In anderen Browsern müsste das ohne diesem Workaround klappen - das musst Du noch testen. (Ach ja, ich teste nicht auf das Vorhandensein von previewWin.document.charset, da jeder Browser das Erstellen einer Variable innerhalb eines Objektes kann und somit in anderen Browsern einfach nichts weiteres passiert)

            previewWin.document.write("<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">")

            previewWin.document.write("<meta http-equiv="Content-Type" content="text/html; charset=iso-8869-1">")

            Grüße,

            Christian

            --
            Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                                  -- Albert Einstein
            1. Hallo,

              previewWin.document.write("<meta http-equiv="Content-Type" content="text/html; charset=iso-8869-1">")

              Habe ich alles gemacht. die codierung unicode bleibt im erzeugten fenster.
              Hast Du es selber schon probiert?

              Gruss Martin Klos

              1. Hallo Martin,

                previewWin.document.write("<meta http-equiv="Content-Type" content="text/html; charset=iso-8869-1">")
                Habe ich alles gemacht. die codierung unicode bleibt im erzeugten fenster.
                Hast Du es selber schon probiert?

                Hmmm. Jetzt wo Dus sagst... Also erst einmal kann ichs nicht im IE testen, bin im Moment unter Linux und würde ungern für so etwas neu booten. Der Mozilla selbst nimmt immer den Zeichensatz des Dokuments, was das Fenster erzeugt. (was ja in Ordnung wäre) Die <meta>-Angabe kannst Du also aus dem Fenster rausschmeissen... Funktioniert die Zeile

                previewWin.document.charset = 'iso-8859-1';

                wirklich nicht?

                Vielleicht musst Du vor den ganzen previewWin.document.write() ein

                previewWin.document.open();

                und danach ein

                previewWin.document.close();

                machen.

                Was ist bei Dir im IE eigentlich die Kodierung der Seite, die das Popup erzeugt?

                Grüße,

                Christian

                --
                Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                                      -- Albert Einstein
                1. Hallo,

                  Was ist bei Dir im IE eigentlich die Kodierung der Seite, die das Popup erzeugt?

                  Das aufrufende Fenster steht auf ISO.

                  Gruss Martin Klos

                  1. Jubbiduu ich habe es:

                    die Einstellung vom charset erst am Schluss eingeben.
                    Vielleicht kommt der IE 5.5 durcheinander, wenn noch nix geschrieben wurde.

                    Ich danke Dir Christian. Deine Tipps waren gut

                    previewWin.document.charset="iso-8859-1";
                    previewWin.document.close();