menphrad: XHTML & PHP

Hi!

Ist es möglich, in einer PHP-Datei XHTML-Code zu schreiben?
Bei HTML konnte man PHP-Dateien ja einfach mit HTML-Headern beginnen, XHTML muss man aber mit
<?xml version="1.0" encoding="iso-8859-1"?>
starten -- und da wirft PHP einen Fehler aus! Grund ist das folgende Konstrukt:
<?php echo "<?xml version="1.0" encoding="iso-8859-1"?>"; ?>
Da am Ende 2x das Script-Ende "?>" vorkommt ...

Wie kann ich sowas umgehen und maskieren ... oder ist das überhaupt nicht möglich?

Greetingz,

Manfred

--
"Man muss die Welt nicht verstehen, man muss sich nur in ihr zurechtfinden" (Albert Einstein)
Manfred Wiesinger
http://manfred-wiesinger.com
http://menphrad.net
  1. Hallo,

    In echo eingeschlossen sollte es aber eigentlich gehen. Ich setzt genau folgendes Konstrukt bei mir ein und es geht:

    <?PHP
     echo"<?xml version="1.0" encoding="iso-8859-1"?>\n";
    ?>

    Heiner

    1. <?PHP
       echo"<?xml version="1.0" encoding="iso-8859-1"?>\n";
      ?>

      Hallo Heiner!

      Erstmal vielen Dank für Deine Antwort!
      Ich hab mich in der Zwischenzeit etwas herumgespielt ... und dabei bemerkt, dass Dreamweaver MX dieses Problem löst! ;-)
      Wenn man bei Dreamweaver MX auf [ File > New > Dynamic Page > PHP ] geht & dabei "Make Document XHTML Compliant" aktiviert, dann spuckt er die folgende erste Zeile aus:

      <?php
       echo "<?xml version="1.0" encoding="iso-8859-1"?".">";
      ?>

      Er macht also auch einen kleinen Work-Around, siehe die Zeichenkette
      ... ?"."> ...
      ;-)

      Nochmals vielen Dank & schönen Tag noch!

      Greetingz,

      Manfred

      --
      "Man muss die Welt nicht verstehen, man muss sich nur in ihr zurechtfinden" (Albert Einstein)
      Manfred Wiesinger
      http://manfred-wiesinger.com
      http://menphrad.net
  2. ...XHTML muss man aber mit

    <?xml version="1.0" encoding="iso-8859-1"?>
    starten -- und da wirft PHP einen Fehler aus! Grund ist das folgende Konstrukt:
    <?php echo "<?xml version="1.0" encoding="iso-8859-1"?>"; ?>
    Da am Ende 2x das Script-Ende "?>" vorkommt ...

    Wie kann ich sowas umgehen und maskieren ... oder ist das überhaupt nicht möglich?

    Bei mir funktioniert dein Codestückchen einwandfrei. Sicher, dass du dich nicht irgendwo mit den Anführungszeichen verschrieben hast?

    --
    sh:( fo:| ch:? rl:( br:$ n4:° ie:| mo:) va:) de:[ zu:) fl:( ss:| ls:[ js:(
  3. Hallo menphrad,

    Bei HTML konnte man PHP-Dateien ja einfach mit HTML-Headern beginnen, XHTML muss man aber mit
    <?xml version="1.0" encoding="iso-8859-1"?>
    starten -- und da wirft PHP einen Fehler aus! Grund ist das folgende Konstrukt:
    <?php echo "<?xml version="1.0" encoding="iso-8859-1"?>"; ?>
    Da am Ende 2x das Script-Ende "?>" vorkommt ...

    PHP interpretiert auch, was in Anfuehrungszeichen steht - wenn Du die Anfuehrungszeichen durch einfache Anfuehrungszeichen (') ersetzt, wird die Zeichenkette als String behandelt und einfach ausgegeben.

    <?php
    echo '<?xml version="1.0" encoding="iso-8859-1"?>';
    ?>

    funktioniert also einwandfrei - ohne Dreamweaver, ohne Workaround, mit PHP und mit XHTML ;)

    Beste Gruesse

    Jan

  4. Hallo Manfred,

    XHTML muss man aber mit <?xml version="1.0" encoding="iso-8859-1"?>
    starten

    Muß man nicht. Der XHTML-1.0-Standard sagt:

    »An XML declaration is not required in all XML documents; however XHTML
      document authors are strongly encouraged to use XML declarations in all
      their documents. Such a declaration is required when the character encoding
      of the document is other than the default UTF-8 or UTF-16 and no encoding
      was determined by a higher-level protocol.«
      (http://www.w3.org/TR/xhtml1/#strict)

    In bestimmten Browsern kann das sogar zu Problemen führen. Im Internet
    Explorer 6 ist diese Deklaration ein Wert fürs Doctype Switching, der
    dazu führt, daß er das Dokument nicht mehr im Standards Mode sondern
    im Quirks Mode anzeigt.

    http://www.hut.fi/u/hsivonen/doctype.html

    Ich würde deswegen darauf verzichten.

    Tim

    1. Hallo,

      Quirks Mode

      Was ist das?

      Jan

      1. Hallo Jan,

        Quirks Mode

        Was ist das?

        Steht auf der verlinkten Seite (http://www.hut.fi/u/hsivonen/doctype.html): "The bugs and non-standards behaviors of old browsers such as Netscape Navigator 4.x and IE 5 for Windows are called 'quirks'."

        Beste Gruesse

        Jan

        1. Wie jetzt, manche Browser haben da zwei Modi?

          Jan W.

          1. Hallo Jan,

            Wie jetzt, manche Browser haben da zwei Modi?

            Der Mozilla sogar drei. ;-)

            http://www.mozilla.org/docs/web-developer/quirks/doctypes.html

            Tim

          2. Hallo,

            Wie jetzt, manche Browser haben da zwei Modi?

            Ja, schreibe mal in ein Dokument:

            <body onload="if(document.compatMode)alert(document.compatMode)">

            und das Ergebnis ist in neueren Browsern CSS1Compat (standards-compliant mode) oder BackCompat (= quirks mode).

            MfG, Thomas

      2. Quirks Mode
        Was ist das?

        Im Internet geistern noch ziemlich viele Seiten herum, die sich einen Dreck um standardkonformes HTML scheren (die allermeisten leider..)
        Der IE (und andere) zeigen daher nicht genau an, was im Quelltext steht, sondern versuchen zu erraten, was der Ersteller sich dabei gedacht haben könnte. So lässt sich so ziemlich jeder Mist irgendwie anzeigen.

        Andererseits sollen konforme Seiten so angezeigt werden, wie es im Quelltext steht.

        Der IE checkt daher die erste Zeile des Quelltextes (und dummerweise wirklich nur die) ob ein Doctype drinnsteht. Wenn ja hält er sich (mehr oder weniger) an diese Regeln, wenn nicht wechselt er in den Quirks Mode und veranstaltet lustiges Gestaltungsraten mit Michael.

        Wenn du dich also an den Standard hältst _kann_ der Quirks Mode Probleme verursachen, dann solest du auf <?xml version="1.0" encoding="iso-8859-1"?> verzichten.

        dbenzhuser

        --
        sh:( fo:| ch:? rl:( br:$ n4:° ie:| mo:) va:) de:[ zu:) fl:( ss:| ls:[ js:(
        1. Hallo,

          Im Internet geistern noch ziemlich viele Seiten herum, die sich einen Dreck um standardkonformes HTML scheren (die allermeisten leider..)

          Das ist ein super pauschale und reichlich unüberlegte Aussage.
          Man kann eine durchaus valide HTML-Seite erstellen, die einem Browser trotzdem zu Quirks-Mode veranlasst:
          -------------- IE ----------
          Both of the declarations in the following example specify conformance to the Transitional HTML4.0 DTD. The second declaration specifies the URL of the DTD. The first declaration does not. The second declaration switches on standards-compliant mode with Internet Explorer 6 or later. The first declaration does not.

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
              "http://www.w3.org/TR/html4/loose.dtd">
          ----------------------------

          ---------- Mozilla ---------
          The following trigger quirks mode ...
          The public identifier "-//W3C//DTD HTML 4.01 Transitional//EN", without a system identifier.
          ----------------------------

          Summa Summarum auch! valide Seiten können einem Browser zu Quirks-Mode veranlassen. (Das Angeben einer SYSTEM-Identifyer ist bei DOCTYPE-Deklaration für HTML nicht zwingend!)

          Grüße
          Thomas

    2. Hallo,

      XHTML muss man aber mit <?xml version="1.0" encoding="iso-8859-1"?> starten

      Muß man nicht. Der XHTML-1.0-Standard sagt:

      Da steht wahrlich nicht umsonst »strongly encouraged«.

      »An XML declaration is not required in all XML documents; however XHTML document authors are strongly encouraged to use XML declarations in all their documents. Such a declaration is required when the character encoding of the document is other than the default UTF-8 or UTF-16 and no encoding was determined by a higher-level protocol.«
        (http://www.w3.org/TR/xhtml1/#strict)

      Der Witz dabei ist, dass nicht garantiert werden kann, dass das darüberliegende Transportprotokoll immer HTTP ist und immer eine entsprechende Kodierungsangabe mitgeliefert wird, da das Dokument in mannigfachen Kontexten angezeigt bzw. verarbeitet werden kann. Das wird vor allem kritisch, wenn man XML-kompatibles XHTML schreiben will (das ist Angesichts der Praxis leider kein Pleonasmus), also an irgendeiner Stelle ein XML-Parser eingesetzt wird, der sich um meta-http-equiv-Kodierungsangaben nicht schert.

      Siehe u.a. </archiv/2003/9/57836/#m324698> ff.

      Beispielsweise ein XHTML-Dokument mit Kodierungsangabe in der XML-Deklaration als .xhtml über das lokale Dateisystem:
      <img src="http://home.t-online.de/home/dj5nu/fanhost/xhtml1.png" border="0" alt="">

      Ohne XHTML-Deklaration:
      <img src="http://home.t-online.de/home/dj5nu/fanhost/xhtml2.png" border="0" alt="">

      Wenn ein Browser trotzdem andere Kodierungen als UTF-8 anwendet bzw. probiert (macht Gecko meines Wissens, zumindest unter Windows), fällt das m.E. in den Bereich automatische Fehlerkorrektur, und auf das Ratespiel würde ich mich nicht verlassen.

      Ich würde deswegen darauf verzichten.

      Wenn man immer schön dafür sorgt, dass das Dokument auf keinen Fall als XML verarbeitet wird oder wenn man die XML-Deklaration im Falle von application/xhtml+xml-fähigen Browsern einfügt...

      M.

      1. Hallo Mathias,

        Beispielsweise ein XHTML-Dokument mit Kodierungsangabe in der XML-Deklaration als .xhtml über das lokale Dateisystem:
        http://home.t-online.de/home/dj5nu/fanhost/xhtml1.png

        Ohne XHTML-Deklaration:
        http://home.t-online.de/home/dj5nu/fanhost/xhtml2.png

        Das verstehe ich jetzt nicht.
        Ich habe jetzt mit Firebirds und Opera getestet (beide Dokumente sind XHTML Doks):
        ------------------------------------------------
        http://127.0.0.1/forum/buch_xhtml.xhtml

        HTTP/1.x 200 OK
        Date: Wed, 12 Oct 2003 17:17:24 GMT
        Server: Apache/2.0.43 (Win32) PHP/4.3.0
        Last-Modified: Wed, 12 Oct 2003 17:14:42 GMT
        Etag: "0-29f-44586480"
        Accept-Ranges: bytes
        Content-Length: 671
        Keep-Alive: timeout=15, max=100
        Connection: Keep-Alive
        Content-Type: application/xhtml+xml
        ----------------------------------------------------------
        http://127.0.0.1/forum/buch_xhtml.html

        HTTP/1.x 200 OK
        Date: Wed, 12 Oct 2003 17:17:53 GMT
        Server: Apache/2.0.43 (Win32) PHP/4.3.0
        Last-Modified: Wed, 12 Oct 2003 17:14:58 GMT
        Etag: "0-29f-454c8880"
        Accept-Ranges: bytes
        Content-Length: 671
        Keep-Alive: timeout=15, max=100
        Connection: Keep-Alive
        Content-Type: text/html; charset=ISO-8859-1
        ----------------------------------------------------------

        Beide zeigten mir beide Seiten identisch an (auch ohne charset durch HTTP, bzw. auch über das lokale System (ich habe extra für .xhtml das jetzt auf application/xhtml+xml umgestellt)
        Beide Browser haben die Einstellung "automatisch" bei Encoding.

        Erst wenn ich dies explizit im Browser verändert habe, kamen die kleinen Kästchen/ Fragezeichen: beide zeigten in diesem Fall (encoding des Browser auf UTF-8 umgestellt) Kästchen/ Fragezeichen mit _und_ ohne die XML-Deklaration im Dokument.
        Das sowohl über das lokale System als auch über HTTP.
        (übrigens beide zeigten sowohl das xhtml als auch das html Dokument ohne die XML-Dekl. auch mit US-ASCII als Encoding richtig an)

        D.h. wenn ich die Encoding im Browser umstellte, wurden alle anderen Encodings ignoriert (ob über HTTP oder über die XML-Dekl.)

        So ... und jetzt habe ich genug getestet ;-)

        Grüße
        Thomas

        1. Hallo Thomas,

          Beispielsweise ein XHTML-Dokument mit Kodierungsangabe in der XML-Deklaration als .xhtml über das lokale Dateisystem:
          http://home.t-online.de/home/dj5nu/fanhost/xhtml1.png

          Ohne XHTML-Deklaration:
          http://home.t-online.de/home/dj5nu/fanhost/xhtml2.png

          Das verstehe ich jetzt nicht.
          Ich habe jetzt mit Firebirds und Opera getestet (beide Dokumente sind XHTML Doks):

          Ohne XML-Deklaration/encoding-Attribut und ohne Kodierungsangabe via meta-Element? Mein Testdokument sieht so aus:

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
          <head>
          <title>Testdokument</title>
          </head>
          <body>
          <p>Dies ist ein XHTML-Dokument mit Zeichen aus<br />dem 8-Bit-Bereich von ISO-8859-1 kodiert in ISO-8859-1.</p>
          <p>¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐ<br />ÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</p>
          </body>
          </html>

          (Die Zeichen werden wahrscheinlich nicht alle übertragen, es sind wie gesagt die 8-Bit-Zeichen von ISO-8859-1.)

          Das Dokument wird ohne charset-Angabe im Content-Type-Header ausgeliefert (mir ging es aber im Grunde genommen nur um Dokumente außerhalb des HTTP-Kontexts und somit um die XML-Deklaration).

          Beide zeigten mir beide Seiten identisch an (auch ohne charset durch HTTP, bzw. auch über das lokale System (ich habe extra für .xhtml das jetzt auf application/xhtml+xml umgestellt)

          Gecko (hier unter Windows) rät bei fehlenden Angaben die Kodierung. Dabei kommt bei Hinweisen auf ISO-8859-1 Windows-1252 heraus, und UTF-8 erkennt er auch als solches. Das ist meines Wissens lediglich Fehlertoleranz und ignoriert im Falle von XHTML als application/xhtml+xml/.xhtml XML-Regeln.

          Opera 7.20 rät meinen Tests zufolge bei XHTML nicht. Wenn ein XHTML-Dokument als application/xhtml+xml ausgeliefert wird bzw. als solches lokal aufgerufen wird und keine Kodierung (HTTP-Header oder XML-Deklaration) angegeben ist, nimmt Opera immer als Fallback UTF-8 an. Dadurch entsteht das genannte Zeichenchaos, wenn das Dokument eine andere Kodierung verwendet. In den Fällen ist in der Hotlist-Karteikarte Info zu lesen:
          Encoding from server (used by Opera):

          • not supplied - (utf-8)
            (Unter »Encoding from server« steht die irgendwo angegebenen Kodierung [auch meta-Element und XML-Deklaration], damit ist nicht zwangsläufig HTTP gemeint, eine Byte Order Mark wird bspw. auch als Indikator genutzt.)
            Wenn allerdings ein meta-Element mit Kodierung existiert, wird diese verwendet - was nach XML-Regeln kompletter Unsinn ist, aber im Hinblick auf das Ausgangsproblem zu begrüßen ist... Denn ein meta-Element ist unproblematisch. Nur ist wie gesagt das Ratespiel genauso wenig verlässlich wie dieser Workaround auf andere Browser übertragbar.

          Erst wenn ich dies explizit im Browser verändert habe, kamen die kleinen Kästchen/ Fragezeichen: beide zeigten in diesem Fall (encoding des Browser auf UTF-8 umgestellt) Kästchen/ Fragezeichen mit _und_ ohne die XML-Deklaration im Dokument.
          Das sowohl über das lokale System als auch über HTTP.

          Bei Gecko ist das wie gesagt über die automatische Erkennung erklärbar, beim Opera teile ich im Falle von »echtem« XHTML deine Beobachtung nicht, kann es mir nur durch ein eventuell vorhandenes meta-Element erklären; oder du verwendest eine andere Opera-Version.

          (übrigens beide zeigten sowohl das xhtml als auch das html Dokument ohne die XML-Dekl. auch mit US-ASCII als Encoding richtig an)

          Diesen Satz verstehe ich nicht. Falls du meinst, trotz US-ASCII-Kodierungsangabe über HTTP/XML-Deklaration/meta-Element die 8-Bit-Zeichen trotzdem gemäß Windows-1252 umgesetzt werden: das stimmt. Falls du meinst, dass Opera Windows-1252 letztlich verwendet, wenn man die Kodierung manuell auf US-ASCII stellt: das stimmt auch.

          Mathias

          1. Hallo Mathias,

            Ohne XML-Deklaration/encoding-Attribut und ohne Kodierungsangabe via meta-Element?

            Ja.

            Mein Testdokument sieht so aus:

            Habe ich bei mir ausprobiert, alles wird angezeigt: sowohl über das lokale Sysem, als auch über den Webserver. In Opera und Firebirds.
            Nur wenn ich die Encoding von Hand umstelle passiert was.

            Mein Dok was fast genau so:
            <!DOCTYPE html
              PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
               <head>
                  <title>bla bla</title>
               </head>
               <body>
            <!-- ein wenig Inhalt mit Umlauten etc. -->
               </body>
            </html>

            (Die Zeichen werden wahrscheinlich nicht alle übertragen, es sind wie gesagt die 8-Bit-Zeichen von ISO-8859-1.)

            Sind alle da.

            Opera 7.20 rät meinen Tests zufolge bei XHTML nicht. Wenn ein XHTML-Dokument als application/xhtml+xml ausgeliefert wird bzw. als solches lokal aufgerufen wird und keine Kodierung (HTTP-Header oder XML-Deklaration) angegeben ist, nimmt Opera immer als Fallback UTF-8 an.

            Aha... ich habe 7.11 und er sagt (war deine Datei) :

            URL of main page:
            http://127.0.0.1/forum/xhtml2.xhtml
            Encoding from server (used by Opera):
            (windows-1252)
            MIME type from server:
            application/xhtml+xml
            Local cache file:
            C:\Programme\Opera7\Cache4\opr0009V.xml
                                              ^^^^^^
            ---------------------------------------
            URL of main page:
            file://localhost/F:/forumtests/xhtml2.html
            Encoding from server (used by Opera):
            (windows-1252)
            MIME type from server:
            text/html
            -----------------------------------------

            Zumindest weiss ich jetzt warum er bei mir alle Zeichen anzeigt. Encoding ist auf "Auto Detect". Darin ist er übrigens einig mit Firebird, der nimmt auch die Encoding vom OS (win98) an.

            (Unter »Encoding from server« steht die irgendwo angegebenen Kodierung [auch meta-Element und XML-Deklaration], damit ist nicht zwangsläufig HTTP gemeint, eine Byte Order Mark wird bspw. auch als Indikator genutzt.)

            Wenn ich die XML-Dekl. hinzufüge sagt mir Opi folgendes:
            Encoding from server (used by Opera):
            iso-8859-1 (windows-1252)

            Bei Gecko ist das wie gesagt über die automatische Erkennung erklärbar, beim Opera teile ich im Falle von »echtem« XHTML deine Beobachtung nicht, kann es mir nur durch ein eventuell vorhandenes meta-Element erklären; oder du verwendest eine andere Opera-Version.

            Keine Meta-Angaben, aber wie gesagt 7.11

            (übrigens beide zeigten sowohl das xhtml als auch das html Dokument ohne die XML-Dekl. auch mit US-ASCII als Encoding richtig an)

            Falls du meinst, dass Opera Windows-1252 letztlich verwendet, wenn man die Kodierung manuell auf US-ASCII stellt: das stimmt auch.

            Das habe ich gemeint.
            Und jetzt wissen wir aber wirklich alles über Opera ;-)

            Grüße
            Thomas