KraKi: Wir haben dem InternetExplorer Unrecht getan

Moin,
wahrscheinlich verkünde ich nun altbekanntes aber... was soll's:

Oft genug und durchweg haben viele - ich eingeschlossen - den IE verflucht, weil er dieses nicht kann und jenes nicht richtig macht. Seit einiger Zeit aber sammle ich auch Browser-Statistiken und habe eben festgestellt: Der IE(6) behauptet gar nicht, dass er html oder xhtml könnte.

Hier meine Statistik über Browser und welche MIME-Typen sie nach eigener Angabe verstehen:
FireFox 1.0.x - - - - -text/xml (100%)
                       application/xml (100%)
                       application/xhtml+xml (100%)
                       text/html (100%)
                       text/plain (100%)
                       image/png (100%)
                       */* (100%)
FireFox 1.5.x - - - - -text/xml (100%)
                       application/xml (100%)
                       application/xhtml+xml (100%)
                       text/html (100%)
                       text/plain (100%)
                       image/png (100%)
                       */* (100%)
FireFox 2.0.x - - - - -text/xml (100%)
                       application/xml (100%)
                       application/xhtml+xml (100%)
                       text/html (100%)
                       text/plain (100%)
                       image/png (100%)
                       */* (100%)
                       text/vnd.wap.wml (0,7%)
Internet Explorer 6.x -image/gif (94%)
                       image/x-xbitmap (94%)
                       image/jpeg (94%)
                       image/pjpeg (94%)
                       application/x-shockwave-flash (19%)
                       application/vnd.ms-powerpoint (40%)
                       application/vnd.ms-excel (79%)
                       application/msword (79%)
                       */* (100%)
                       application/x-icq (10%)
Opera 9.x - - - - - - -text/html (100%)
                       application/xml (100%)
                       application/xhtml+xml (100%)
                       image/png (100%)
                       image/jpeg (100%)
                       image/gif (100%)
                       image/x-xbitmap (100%)
                       */* (100%)

So, die Prozent-Angaben bezeichnen jeweils wieviel Prozent des jeweiligen Browsers diesen Typ angegeben hat. Von 100% abweichende Werte sind vermutlich Plugins o.ä. (beim FF2 weiß ich es, weil ich diese Extension verwende) oder Unterschiede in der Subversion (das nehme ich z.T. beim IE an).

Der springende Punkt aber ist: Alle Browser außer dem IE geben an, dass sie text/html und application/xhtml+xml verstehen. Alle außer IE und Opera, dass sie text/plain verstehen. Alle Browser geben an, dass sie */* verstehen (Downloads).
Der IE hingegen gibt so manchen völlig web-fremden Typ an (wie die Office-Formate) aber behauptet niemals er verstehe HTML oder eine andere Auszeichnungssprache.
Was schließe ich daraus? Der IE ist scheinbar ein recht vielfältiges Anzeige-Programm, aber keinesfalls ein Web-Browser. Als universelles Anzeigeprogramm scheint man ihn auch sehr individuell anpassen und mit PlugIns erweitern zu können, so dass er noch mehr Formate versteht.
Vieleicht gibt es sogar ein Plugin, welches dem IE beibringt HTML zu verstehen... es nutzt nur keiner meiner Benutzer dieses Plugin.

Haben wir dann nicht dem InternetExplorer immer Unrecht getan? Vieleicht ist dieses Programm gar nicht so furchtbar wie angenommen, nein netterweise versucht es sogar HTML zu interprettieren, behauptet aber nicht, dass es das fehlerfrei könnte.

Ich glaube ich werde von heute an einfach propagieren, dass der InternetExplorer kein Browser ist (auch wenn es der Name sugeriert).

Ich wünsche einen schönen Wochenstart!

  1. Taag,

    ...

    Der springende Punkt aber ist: Alle Browser außer dem IE geben an, dass sie text/html und application/xhtml+xml verstehen. Alle außer IE und Opera, dass sie text/plain verstehen. Alle Browser geben an, dass sie */* verstehen (Downloads).

    Das ist wohl einfach das bekenntnis auf unterstützung (und damit stärkung und anerkennung) von allgemeinen standards zu gunsten von eigenimplementierungen zu verzichten. In dieser offenherzigkeit ist mir das durchaus neu.

    gruß

    michaah

  2. Moin!

    Hier meine Statistik über Browser und welche MIME-Typen sie nach eigener Angabe verstehen:

    So, die Prozent-Angaben bezeichnen jeweils wieviel Prozent des jeweiligen Browsers diesen Typ angegeben hat. Von 100% abweichende Werte sind vermutlich Plugins o.ä. (beim FF2 weiß ich es, weil ich diese Extension verwende) oder Unterschiede in der Subversion (das nehme ich z.T. beim IE an).

    Interessant wäre auch noch, welche Typen die einzelnen Browser bevorzugen (Auswertung des q-Attributs); der Firefox mag nämlich X(HT)ML viel lieber als HTML.

    Der springende Punkt aber ist: Alle Browser außer dem IE geben an, dass sie text/html und application/xhtml+xml verstehen. Alle außer IE und Opera, dass sie text/plain verstehen. Alle Browser geben an, dass sie */* verstehen (Downloads).

    Steht */* wirklich für Downloads? Es heißt doch nur, dass der Useragent _alle Inhaltstypen_ akzeptiert, unabhängig davon, was er damit macht. Beim IE kann das z.B. bedeuten, dass er HTML und Plaintext direkt anzeigen kann und für (fast) alles Andere ein passendes Plugin/einen passenden Viewer finden kann. Aus der Aussage Accept: */* kannst du aber nicht folgern:

    Der IE hingegen gibt so manchen völlig web-fremden Typ an (wie die Office-Formate) aber behauptet niemals er verstehe HTML oder eine andere Auszeichnungssprache.

    Der IE gibt nicht _explizit_ an, dass er HTML mag.

    Dass man das ganze besser lösen kann ist natürlich gar keine Frage. Firefox z.B. versieht */* mit der Bewertung 0.5, d.h. er mag X(HT)ML, HTML, Plaintext und diverse Bilder lieber als alles Andere.

    Was schließe ich daraus? Der IE ist scheinbar ein recht vielfältiges Anzeige-Programm, aber keinesfalls ein Web-Browser. Als universelles Anzeigeprogramm scheint man ihn auch sehr individuell anpassen und mit PlugIns erweitern zu können, so dass er noch mehr Formate versteht.

    Wenn der IE tatsächlich _kein Browser_ ist, erklärt das vielleicht einiges.

    Vieleicht gibt es sogar ein Plugin, welches dem IE beibringt HTML zu verstehen... es nutzt nur keiner meiner Benutzer dieses Plugin.

    Das „Plugin“ dürfte mshtml.dll heißen und sagt wahrscheinlich _nicht explizit_, dass es mit HTML etwas anfangen kann.

    Haben wir dann nicht dem InternetExplorer immer Unrecht getan? Vieleicht ist dieses Programm gar nicht so furchtbar wie angenommen, nein netterweise versucht es sogar HTML zu interprettieren, behauptet aber nicht, dass es das fehlerfrei könnte.

    Auch wenn der Schluss mit der aufgebauten Logik falsch ist, so spricht die Praxis doch eindeutig dafür ;-)

    Ich glaube ich werde von heute an einfach propagieren, dass der InternetExplorer kein Browser ist (auch wenn es der Name sugeriert).

    Das ist vielleicht eine gute Idee. Aber wenn wir schon beim IE-Bashing in Analogie zum damaligen Netscape-4-Bashing sind: Bei Jeena Paradies heißt es seit Kurzem: Wann kommt der IE 5.x Nachruf?

    Ich wünsche einen schönen Wochenstart!

    1. Hallo,

      Das ist vielleicht eine gute Idee. Aber wenn wir schon beim IE-Bashing in Analogie zum damaligen Netscape-4-Bashing sind

      ob das, was damals beim NC 4 völliger Unfug war, beim IE 5 besser wird?

      Der wahre Übeltäter ist doch der hinsichtlich CSS enttäuschende IE 7.

      Und Netscape 4 taucht bei webhits.de immer noch mit rund 1,5 % auf,
      ähnlich übrigens Opera...

      Grüsse
      Cyx23

      1. Und Netscape 4 taucht bei webhits.de immer noch mit rund 1,5 % auf,
        ähnlich übrigens Opera...

        Nun, in den Statistiken, die ich kenne läuft Opera aber doch eher in aktuellen Versionen. Im Grunde ist das auch seine Stärke, in allen möglichen Webtechnologien ist Opera der Browser, der sie als erstes richtig umsetzt. Auf einer alten (ich rede jetzt von mehr als ein bis zwei Versionsnummern) Version von Opera fahren imho noch weniger als auf Netscape <= 4.
        Ich persönlich bevorzuge übrigens Opera bei mobilen Endgeräten, denn (um zum OP zurückzukehren) des IE-mobile gibt als Content-Type ausschließlich */* an. ^^ (wobei ich zugeben muss nicht zu wissen, was die mobilen Opera-Varianten als MIMEs angeben, aber afaik funktionieren diese Versionen wie ihre großen Desktop-Brüder).

        Auf de.wikipedia.org glaubt man mir leider nicht, dass der IE kein Browser ist... naja wenn ich die Zeit finde wende ich mich halt an en.wikipedia.org.

        Auf in den Kampf!

        1. Hallo,

          Nun, in den Statistiken, die ich kenne läuft Opera aber doch eher in aktuellen Versionen.

          Die anderthalb Prozent Netscape 4 hatte ich mit der Gesamtverbreitung,
          also alle Versionen, von Opera verglichen, 1,4%. Offenbar verteilt sich
          die Nutzung bei Opera auch auf ältere Versionen:
          Opera 9 0.5%, Opera 8 0.4%, Opera 7 0.4%, Opera 6-? 0.1%.

          Grüsse

          Cyx23

          1. Hallo.
            Gibt es eigentlich Statistiken über Korrektheit, Sinngehalt und Relevanz von Statistiken zur Browser-Nutzung?
            MfG, at

            1. Moin!

              Gibt es eigentlich Statistiken über Korrektheit, Sinngehalt und Relevanz von Statistiken zur Browser-Nutzung?

              Gute Frage, aber sie würden wahrscheinlich für die meisten so genannten Webdesigner ernüchternd ausfallen.

              Schönen Sonntag,
              Robert

            2. Hallo.

              Hi

              Gibt es eigentlich Statistiken über Korrektheit, Sinngehalt und Relevanz von Statistiken zur Browser-Nutzung?

              Naja, man kann wohl davon ausgehen, dass sie nicht so genau sind... das genaueste, was ich ihnen zutraue ist die erste Kommastelle (Prozentangaben). Andere Leute gehen davon aus, dass man grundsätzlich mit einer Fehlerquote von +/-5% rechnen muss.
              In der Wikipedia gibt es dazu eine kleine Diskusion.

              1. Nachtrag: Wie krass unterschiedlich solche Statistiken ausfallen können sieht man vieleicht an den BrowserNews von upsdell.com. In dem Artikel werden sechs Quellen genannt:
                University Illinoi
                Net Applications’ Market Share
                Pitt County, North Carolina website
                US Geological Survey
                Hit-Counter
                eigene Statistik der Seite (nur 50% IE)

    2. Interessant wäre auch noch, welche Typen die einzelnen Browser bevorzugen (Auswertung des q-Attributs); der Firefox mag nämlich X(HT)ML viel lieber als HTML.

      Da unterscheiden sich wohl unsere Daten, laut meinen mag der Firefox am Liebsten HTML und Text.
      FireFox 1.0.x FireFox 1.5.x FireFox 2.0.x (sowie ein von mir nicht identifizierter Client mit Gecko-Engine)
      text/xml
      application/xml
      application/xhtml+xml
      text/html;q=0.9
      text/plain;q=0.8
      image/png
      */*;q=0.5

      Der IE6 gibt am liebsten gar nichts an, z.B.:
      image/gif
      image/x-xbitmap
      image/jpeg
      image/pjpeg
      application/vnd.ms-powerpoint
      application/vnd.ms-excel
      application/msword
      */*
      (der genaue Inhalt kommt wie gesagt auf die neben dem IE installierte Software bzw. etwaige Plugins an)

      Opera 9.x mag XML sogar lieber als XHTML:
      text/html
      application/xml;q=0.9
      application/xhtml+xml
      image/png
      image/jpeg
      image/gif
      image/x-xbitmap
      */*;q=0.1

      1. Moin!

        Das Weglassen des q-Attributes ist mit q=1.0 gleichzusetzen, d.h. deine Schlussfolgerungen sind falsch.

        Viele Grüße,
        Robert

        1. Moin!

          Das Weglassen des q-Attributes ist mit q=1.0 gleichzusetzen, d.h. deine Schlussfolgerungen sind falsch.

          Oh, ok, ich dachte q=0
          Hast du 'ne Quelle?

          1. Hallo KraKi.

            Das Weglassen des q-Attributes ist mit q=1.0 gleichzusetzen, d.h. deine Schlussfolgerungen sind falsch.
            Oh, ok, ich dachte q=0
            Hast du 'ne Quelle?

            Schaust du hier.

            Einen schönen Dienstag noch.

            Gruß, Mathias

            --
            ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
            debian/rules
            1. Schaust du hier.

              Danke ... (auch an Robert Bienert).

          2. Moin!

            Das Weglassen des q-Attributes ist mit q=1.0 gleichzusetzen, d.h. deine Schlussfolgerungen sind falsch.
            Oh, ok, ich dachte q=0
            Hast du 'ne Quelle?

            Wie der Apache damit umgeht findest du unter dem Stichwort Content Negotiation.

            Viele Grüße,
            Robert

  3. Moin!

    Fällt mir gerade brandheiß ein: Wir tun dem Internet Explorer wirklich tagtäglich Unrecht und erwarten Dinge von ihm, die er gar nicht, schließlich ist er nur

    Mozilla/4.0 compatible

    Und Mozilla 4.0 bezeichnet Netscape 4.x.

    Viele Grüße,
    Robert

    1. Hallo,

      Fällt mir gerade brandheiß ein: Wir tun dem Internet Explorer wirklich tagtäglich Unrecht und erwarten Dinge von ihm, die er gar nicht, schließlich ist er nur

      Mozilla/4.0 compatible

      Und Mozilla 4.0 bezeichnet Netscape 4.x.

      Behauptet der IE 7 sowas immer noch? Ausserdem, das haut so nicht hin,
      kompatibel ist er leider nur zu sich selbst, da müssen weder Mosaic noch
      der Netscape 4 verunglimpft werden ;)

      Grüsse

      Cyx23

  4. So, ich habe vor einigen Tagen dann eine Funktion geschrieben, die einfach mal widergibt welche MIMEs die Browser denn so können.
    Dabei haben sich gerade ein paar interessante Dinge eröffnet:
    Safari kann auch nichts außer */*
    Dillo gibt gar keinen ContentType an.

    Die Funktion sieht so aus:

    function ref2arr ($MIME,$type=0 ) {  
      $TEMP_ref2arr1 = explode(',',$MIME);  
      foreach ($TEMP_ref2arr1 as $TEMP_key => $TEMP_value) {  
       if (strpos ( $TEMP_value, 'q=') > 0) {  
        $TEMP_ref2arr2[substr ($TEMP_value,0,strpos ( $TEMP_value, ';q='))] = (float)substr ($TEMP_value,strpos ($TEMP_value, ';q=')+3,strlen($TEMP_value));  
       }  
       else {  
        $TEMP_ref2arr2[$TEMP_value]    = 1;  
       }  
      }  
      
      if ($type == 0) { return($TEMP_ref2arr2); }  
      if ($type == 1) { //will Text oder formatierten Text ausgeben  
       if (isset($TEMP_ref2arr2['application/mshelp']))          { $TEMP_ref2arr3['application/mshelp']          = $TEMP_ref2arr2['application/mshelp'];          }  
       if (isset($TEMP_ref2arr2['application/msword']))          { $TEMP_ref2arr3['application/msword']          = $TEMP_ref2arr2['application/msword'];          }  
       if (isset($TEMP_ref2arr2['application/pdf']))             { $TEMP_ref2arr3['application/pdf']             = $TEMP_ref2arr2['application/pdf'];             }  
       if (isset($TEMP_ref2arr2['application/postscript']))      { $TEMP_ref2arr3['application/postscript']      = $TEMP_ref2arr2['application/postscript'];      }  
       if (isset($TEMP_ref2arr2['application/rtf']))             { $TEMP_ref2arr3['application/rtf']             = $TEMP_ref2arr2['application/rtf'];             }  
       if (isset($TEMP_ref2arr2['application/xhtml+xml']))       { $TEMP_ref2arr3['application/xhtml+xml']       = $TEMP_ref2arr2['application/xhtml+xml'];       }  
       if (isset($TEMP_ref2arr2['application/xmld']))            { $TEMP_ref2arr3['application/xmld']            = $TEMP_ref2arr2['application/xmld'];            }  
       if (isset($TEMP_ref2arr2['text/comma-separated-values'])) { $TEMP_ref2arr3['text/comma-separated-values'] = $TEMP_ref2arr2['text/comma-separated-values']; }  
       if (isset($TEMP_ref2arr2['text/css']))                    { $TEMP_ref2arr3['text/css']                    = $TEMP_ref2arr2['text/css'];                    }  
       if (isset($TEMP_ref2arr2['text/html']))                   { $TEMP_ref2arr3['text/html']                   = $TEMP_ref2arr2['text/html'];                   }  
       if (isset($TEMP_ref2arr2['text/plain']))                  { $TEMP_ref2arr3['text/plain']                  = $TEMP_ref2arr2['text/plain'];                  }  
       if (isset($TEMP_ref2arr2['text/richtext']))               { $TEMP_ref2arr3['text/richtext']               = $TEMP_ref2arr2['text/richtext'];               }  
       if (isset($TEMP_ref2arr2['text/rtf']))                    { $TEMP_ref2arr3['text/rtf']                    = $TEMP_ref2arr2['text/rtf'];                    }  
       if (isset($TEMP_ref2arr2['text/tab-separated-values']))   { $TEMP_ref2arr3['text/tab-separated-values']   = $TEMP_ref2arr2['text/tab-separated-values'];   }  
       if (isset($TEMP_ref2arr2['text/vnd.wap.wml']))            { $TEMP_ref2arr3['text/vnd.wap.wml']            = $TEMP_ref2arr2['text/vnd.wap.wml'];            }  
       if (isset($TEMP_ref2arr2['application/vnd.wap.wmlc']))    { $TEMP_ref2arr3['application/vnd.wap.wmlc']    = $TEMP_ref2arr2['application/vnd.wap.wmlc'];    }  
       if (isset($TEMP_ref2arr2['text/xml']))                    { $TEMP_ref2arr3['text/xml']                    = $TEMP_ref2arr2['text/xml'];                    }  
       return ($TEMP_ref2arr3);  
       }  
      if ($type == 2) { //will Hypertext ausgeben  
       if (isset($TEMP_ref2arr2['application/mshelp']))          { $TEMP_ref2arr3['application/mshelp']          = $TEMP_ref2arr2['application/mshelp'];          }  
       if (isset($TEMP_ref2arr2['application/pdf']))             { $TEMP_ref2arr3['application/pdf']             = $TEMP_ref2arr2['application/pdf'];             }  
       if (isset($TEMP_ref2arr2['application/xhtml+xml']))       { $TEMP_ref2arr3['application/xhtml+xml']       = $TEMP_ref2arr2['application/xhtml+xml'];       }  
       if (isset($TEMP_ref2arr2['text/html']))                   { $TEMP_ref2arr3['text/html']                   = $TEMP_ref2arr2['text/html'];                   }  
       if (isset($TEMP_ref2arr2['text/vnd.wap.wml']))            { $TEMP_ref2arr3['text/vnd.wap.wml']            = $TEMP_ref2arr2['text/vnd.wap.wml'];            }  
       if (isset($TEMP_ref2arr2['application/vnd.wap.wmlc']))    { $TEMP_ref2arr3['application/vnd.wap.wmlc']    = $TEMP_ref2arr2['application/vnd.wap.wmlc'];    }  
       return ($TEMP_ref2arr3);  
       }  
      if ($type == 3) { //will Bild ausgeben  
       if (isset($TEMP_ref2arr2['image/cis-cod']))            { $TEMP_ref2arr3['image/cis-cod']            = $TEMP_ref2arr2['image/cis-cod'];            }  
       if (isset($TEMP_ref2arr2['image/cmu-raster']))         { $TEMP_ref2arr3['image/cmu-raster']         = $TEMP_ref2arr2['image/cmu-raster'];         }  
       if (isset($TEMP_ref2arr2['image/fif']))                { $TEMP_ref2arr3['image/fif']                = $TEMP_ref2arr2['image/fif'];                }  
       if (isset($TEMP_ref2arr2['image/gif']))                { $TEMP_ref2arr3['image/gif']                = $TEMP_ref2arr2['image/gif'];                }  
       if (isset($TEMP_ref2arr2['image/ief']))                { $TEMP_ref2arr3['image/ief']                = $TEMP_ref2arr2['image/ief'];                }  
       if (isset($TEMP_ref2arr2['image/jpeg']))               { $TEMP_ref2arr3['image/jpeg']               = $TEMP_ref2arr2['image/jpeg'];               }  
       if (isset($TEMP_ref2arr2['image/png']))                { $TEMP_ref2arr3['image/png']                = $TEMP_ref2arr2['image/png'];                }  
       if (isset($TEMP_ref2arr2['image/tiff']))               { $TEMP_ref2arr3['image/tiff']               = $TEMP_ref2arr2['image/tiff'];               }  
       if (isset($TEMP_ref2arr2['image/vasa']))               { $TEMP_ref2arr3['image/vasa']               = $TEMP_ref2arr2['image/vasa'];               }  
       if (isset($TEMP_ref2arr2['image/vnd.wap.wbmp']))       { $TEMP_ref2arr3['image/vnd.wap.wbmp']       = $TEMP_ref2arr2['image/vnd.wap.wbmp'];       }  
       if (isset($TEMP_ref2arr2['image/x-freehand']))         { $TEMP_ref2arr3['image/x-freehand']         = $TEMP_ref2arr2['image/x-freehand'];         }  
       if (isset($TEMP_ref2arr2['image/x-portable-anymap']))  { $TEMP_ref2arr3['image/x-portable-anymap']  = $TEMP_ref2arr2['image/x-portable-anymap'];  }  
       if (isset($TEMP_ref2arr2['image/x-portable-bitmap']))  { $TEMP_ref2arr3['image/x-portable-bitmap']  = $TEMP_ref2arr2['image/x-portable-bitmap'];  }  
       if (isset($TEMP_ref2arr2['image/x-portable-graymap'])) { $TEMP_ref2arr3['image/x-portable-graymap'] = $TEMP_ref2arr2['image/x-portable-graymap']; }  
       if (isset($TEMP_ref2arr2['image/x-portable-pixmap']))  { $TEMP_ref2arr3['image/x-portable-pixmap']  = $TEMP_ref2arr2['image/x-portable-pixmap'];  }  
       if (isset($TEMP_ref2arr2['image/x-rgb']))              { $TEMP_ref2arr3['image/x-rgb']              = $TEMP_ref2arr2['image/x-rgb'];              }  
       if (isset($TEMP_ref2arr2['image/x-windowdump']))       { $TEMP_ref2arr3['image/x-windowdump']       = $TEMP_ref2arr2['image/x-windowdump'];       }  
       if (isset($TEMP_ref2arr2['image/x-xbitmap']))          { $TEMP_ref2arr3['image/x-xbitmap']          = $TEMP_ref2arr2['image/x-xbitmap'];          }  
       if (isset($TEMP_ref2arr2['image/x-xpixmap']))          { $TEMP_ref2arr3['image/x-xpixmap']          = $TEMP_ref2arr2['image/x-xpixmap'];                }  
       return ($TEMP_ref2arr3);  
       }  
     }
    

    Sinn der ganzen Geschichte ist natülich gegebenenfalls den Browser zu fragen welchen Inhaltstyp er bevorzugt und so dann Serverseitig den Typ anpassen kann (einem Browser, der kein XHTML versteht HTML liefern, einen Browser, der kein gif versteht wie FireFox png liefern...)
    Ich habe es so aufgerufen:

      
    echo ('<table border="1">');  
      
      echo ('<tr>');  
      echo ('<th colspan="2">');  
      echo ('MIME-Typen, die fuer formatierten Text gedacht sind:');  
      echo ('</th>');  
      echo ('</tr>');  
      $Typen = ref2arr($_SERVER['HTTP_ACCEPT'],1);  
      echo ("\n<!--\n");  
      if (arsort($Typen)) {  
       echo ("\n-->\n");  
       foreach ($Typen as $key => $value) {  
        echo ("\n<tr><td>$key</td><td>$value</td></tr>");  
       }  
      }  
      else {  
       echo ("\n-->\n");  
       echo ("\n<tr><td colspan=\"2\">keine</td></tr>");  
      }  
      echo ('<tr>');  
      echo ('<th colspan="2">');  
      echo ('MIME-Typen, die fuer Hyper-Text gedacht sind:');  
      echo ('</th>');  
      echo ('</tr>');  
      $Typen = ref2arr($_SERVER['HTTP_ACCEPT'],2);  
      echo ("\n<!--\n");  
      if (arsort($Typen)) {  
       echo ("\n-->\n");  
       foreach ($Typen as $key => $value) {  
        echo ("\n<tr><td>$key</td><td>$value</td></tr>");  
       }  
      }  
      else {  
       echo ("\n-->\n");  
       echo ("\n<tr><td colspan=\"2\">keine</td></tr>");  
      }  
      echo ('<tr>');  
      echo ('<th colspan="2">');  
      echo ('MIME-Typen, die fuer Bilder gedacht sind:');  
      echo ('</th>');  
      echo ('</tr>');  
      $Typen = ref2arr($_SERVER['HTTP_ACCEPT'],3);  
      echo ("\n<!--\n");  
      if (arsort($Typen)) {  
       echo ("\n-->\n");  
       foreach ($Typen as $key => $value) {  
        echo ("\n<tr><td>$key</td><td>$value</td></tr>");  
       }  
      }  
      else {  
       echo ("\n-->\n");  
       echo ("\n<tr><td colspan=\"2\">keine</td></tr>");  
      }  
      echo ('<tr>');  
      echo ('<th colspan="2">');  
      echo ('alle MIME-Typen:');  
      echo ('</th>');  
      echo ('</tr>');  
      $Typen = ref2arr($_SERVER['HTTP_ACCEPT'],0);  
      echo ("\n<!--\n");  
      if (arsort($Typen)) {  
       echo ("\n-->\n");  
       foreach ($Typen as $key => $value) {  
        echo ("\n<tr><td>$key</td><td>$value</td></tr>");  
       }  
      }  
      else {  
       echo ("\n-->\n");  
       echo ("\n<tr><td colspan=\"2\">keine</td></tr>");  
      }  
     }  
      
     echo ('</table>');
    

    Dabei dienen die Kommentare dazu die Fehlermeldung zu verbergen (ausegegeben werden sollen sie ja trotzdem), falls die Funktion keinen Typ zurück gibt.

    1. Moin!

      Dabei haben sich gerade ein paar interessante Dinge eröffnet:
      Safari kann auch nichts außer */*

      Das hast du schön gesagt, bedeutet doch */*, dass der Useragent _alles_ kann. Damit heißt dein Satz also

      „Safari kann auch nichts außer allem.“

      Dillo gibt gar keinen ContentType an.

      Das ist doch viel interessanter.

      Sinn der ganzen Geschichte ist natülich gegebenenfalls den Browser zu fragen welchen Inhaltstyp er bevorzugt und so dann Serverseitig den Typ anpassen kann (einem Browser, der kein XHTML versteht HTML liefern, einen Browser, der kein gif versteht wie FireFox png liefern...)

      Dafür gibt es ein nettes Apache-Feature namens Content Negotiation, du brauchst also das Rad gar nicht noch einmal zu erfinden. Der Rest ist dann einfach Experiment:

      Nehmen wir ein Verzeichnis mit folgenden Dateien: index.html, index.html.gz, index.xhtml, index.xhtml.gz, index.txt, index.txt.gz und eingeschaltetetem Content Negotiation, dann erhalten folgende Browser folgende Seiten vom Apachen:

      • Camino (Gecko): index.xhtml.gz
         Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, …)
       • Safari (WebKit): index.txt.gz
         Accept: */*)
       • Internet Explorer Mac: index.txt
         Accept: */*)

      Aus der Praxis wissen wir aber, dass Safari auch XHTML kann und der HTML versteht.

      Dabei dienen die Kommentare dazu die Fehlermeldung zu verbergen (ausegegeben werden sollen sie ja trotzdem), falls die Funktion keinen Typ zurück gibt.

      Das kann man aber auch programmiertechnisch eleganter lösen.

      Viele Grüße,
      Robert

      1. Moin!

        Dabei haben sich gerade ein paar interessante Dinge eröffnet:
        Safari kann auch nichts außer */*

        Das hast du schön gesagt, bedeutet doch */*, dass der Useragent _alles_ kann. Damit heißt dein Satz also

        „Safari kann auch nichts außer allem.“

        Das ist mir klar, aber wie oben beschrieben würde ich die Angabe */* am ehesten so interprettieren, dass der Browser herunterladen kann (denn so verarbeitet ein Browser ja normalerweise Inhalte, die er nicht auswerten kann). Dass das eine vage Annahme ist ist mir durchaus bewusst, aber andernfalls macht */* auch nur sehr wenig Sinn.

        Dafür gibt es ein nettes Apache-Feature namens Content Negotiation, du brauchst also das Rad gar nicht noch einmal zu erfinden.

        Interessant... ich kann bei einem fremden Hoster (und ich benutze einen) derartige Einstellungen nur selten vornehmen.

        Nehmen wir ein Verzeichnis mit folgenden Dateien: index.html, index.html.gz, index.xhtml, index.xhtml.gz, index.txt, index.txt.gz und eingeschaltetetem Content Negotiation, dann erhalten folgende Browser folgende Seiten vom Apachen:

        • Camino (Gecko): index.xhtml.gz
           Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, …)
        • Safari (WebKit): index.txt.gz
           Accept: */*)
        • Internet Explorer Mac: index.txt
           Accept: */*)

        Da finde ich es aber fraglich, warum man den Browsern, die ja "alles" verstehen ausgerechnet text/plain sendet. Ich meine... ich würde es auch so ähnlich handhaben, aber eigentlich sagt der Browser - wie du oben erwähntest - "Ich kann alles!". Tja, dann kann ich ihm ja auch liefern was ich will ^^

        Naja, in der Tat hatte ich vor auch noch eine Rangfolge wie der Server (bzw. Autor) es ausliefern will zu schreiben. Also werde ich quasi festlegen, dass ich am liebsten in xhtml ausliefere, dann in html und dann in wml2(XHTMLmp) und dann in wml1. Diese Liste wird dann mit dem zurück gegebenen array verglichen, also wenn unter den höchsten q-Werten (wahrscheinlich 1) application/xhtml+xml steht, dass dann eben auch das ausgeliefert wird. Aber da text/html möglichweise ja auch q=1 hat muss ich mich wohl entscheiden und daher die Prioritäten-Liste. (Vieleicht stelle ich wml1 ja sogar ganz an den Anfang...)
        Desweiteren dachte ich analog zur "Dein Browser unterstützt keine Frames, get Netscape" einen text/plain auszugeben mit dem Inhalt:

        Dein Browser unterstuetzt kein gaengiges hypertext-Format.
        Bitte nutze einen Browser, der Hypertext unterstuetzt. Zum Beispiel:
        Systemuebergreifend:

        Mozilla FireFox ( http://mozilla.com )

        Opera ( http://www.opera.com/lang/de/ )

        Netscape Navigator ( http://browser.netscape.com )

        Mozilla SeaMonkey ( http://www.mozilla.org/projects/seamonkey/ http://www.seamonkey.at )

        HotJava ( http://java.sun.com/products/hotjava/3.0/ )

        Microsoft Windows:

        K-Meleon ( http://kmeleon.sourceforge.net/wiki/ )

        Linux und Unix:

        Epiphany ( http://www.gnome.org/projects/epiphany/ )

        Galeon ( http://galeon.sourceforge.net )

        Konqueror ( http://www.konqueror.org )

        fuer mobile Geraete:

        Opera  ( http://www.opera.com/products/mobile/ )

        Das ist total unschön und auch verwerflich (ja, das weiß ich), aber ich betone, dass ich diese Technik für eine sehr private und unkommezielle Seite verwenden werde. (Die Liste stammt übrigens aus Wikipedia und wurde abgeglichen ob diese Browser denn text/html o.ä. angeben).

        Aus der Praxis wissen wir aber, dass Safari auch XHTML kann und der HTML versteht.

        Absolut, aus der Praxis wissen wir auch, dass der IE html halbwegs versteht (also i.d.R. irgend etwas ausgibt, was man lesen kann und was inhaltlich das ist, was man haben wollte). Die Frage ist doch, warum enthalten uns manche Browser-Schreiber diese Information vor? Wenn der User sie verbergen will, dann kann/sollte man das einfach einstellen können. Ich halte die Empfehlung vom W3C für ideal, ein Browser sollte alles angeben, was er kann und gegebenenfalls auch besagten q-Wert. Als Webseiten-Schreiberling kann ich dann ja immernoch entscheiden, wie ich mit dieser Angabe umgehe (ganz ignorieren, q-Wert ignorieren, oder eben nicht...).

        Das kann man aber auch programmiertechnisch eleganter lösen.

        Bestimmt, z.B. mit display:none oder die Fehler in eine Datenbank schreiben oder in eine Datei oder... ich habe den einfachsten Weg gewählt ^^

        1. Moin!

          Das ist mir klar, aber wie oben beschrieben würde ich die Angabe */* am ehesten so interprettieren, dass der Browser herunterladen kann (denn so verarbeitet ein Browser ja normalerweise Inhalte, die er nicht auswerten kann). Dass das eine vage Annahme ist ist mir durchaus bewusst, aber andernfalls macht */* auch nur sehr wenig Sinn.

          Falsch! Was macht denn ein Gecko z.B. wenn er ein <object> eines ihm unbekannten Typs findet? – Er sucht nach einem passenden Plugin. Insofern ist die Behauptung des Useragents, dass er mit allem etwas anfangen kann vollkommen korrekt. So, wie der IE ins System eingebunden ist, geht wahrscheinlich auch er davon aus, dass er mit einem bestimmten MIME-Type etwas anfangen kann.

          Dafür gibt es ein nettes Apache-Feature namens Content Negotiation, du brauchst also das Rad gar nicht noch einmal zu erfinden.
          Interessant... ich kann bei einem fremden Hoster (und ich benutze einen) derartige Einstellungen nur selten vornehmen.

          Das stimmt leider, wobei mir unklar ist, warum. Schließlich kann man mit Content Negotiation auch den Traffic senken: Bei der Auswahl zwischen index.html und index.html.gz (gzipte Variante von index.html) bekommen moderne Browser™ die komprimierte Version.

          Nehmen wir ein Verzeichnis mit folgenden Dateien: index.html, index.html.gz, index.xhtml, index.xhtml.gz, index.txt, index.txt.gz und eingeschaltetetem Content Negotiation, dann erhalten folgende Browser folgende Seiten vom Apachen:

          • Camino (Gecko): index.xhtml.gz
             Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, …)
          • Safari (WebKit): index.txt.gz
             Accept: */*)
          • Internet Explorer Mac: index.txt
             Accept: */*)

          Da finde ich es aber fraglich, warum man den Browsern, die ja "alles" verstehen ausgerechnet text/plain sendet.

          Ich muss dabei zugeben, dass ich text/plain nur wegen lynx mit verwendet habe. Bei der Auswahl zwischen HTML und XHTML hätten Safari und der MacIE wahrscheinlich HTML serviert bekommen. Wahrscheinlich traut der Apache Useragents, die „Accept: */*“ sagen, nicht.

          Ich meine... ich würde es auch so ähnlich handhaben, aber eigentlich sagt der Browser - wie du oben erwähntest - "Ich kann alles!". Tja, dann kann ich ihm ja auch liefern was ich will ^^

          Theoretisch schon. Aber weißt du, was die Besucher deiner Seite, die mit dem IE unterwegs sind, davon halten, wenn der IE ihnen bereits die Startseite zum Download anbietet („unbekannter Typ: application/xhtml+xml“).

          Da habe ich mal eine Frage an die Windowsbenutzer: Trägt Firefox/Seamonkey nicht in der Registry ein, dass er application/xhtml+xml mag? Dann müsste der IE statt eines Downloaddialoges doch diese Anwendung öffnen – sofern installiert.

          Naja, in der Tat hatte ich vor auch noch eine Rangfolge wie der Server (bzw. Autor) es ausliefern will zu schreiben. Also werde ich quasi festlegen, dass ich am liebsten in xhtml ausliefere, dann in html und dann in wml2(XHTMLmp) und dann in wml1. Diese Liste wird dann mit dem zurück gegebenen array verglichen, also wenn unter den höchsten q-Werten (wahrscheinlich 1) application/xhtml+xml steht, dass dann eben auch das ausgeliefert wird. Aber da text/html möglichweise ja auch q=1 hat muss ich mich wohl entscheiden und daher die Prioritäten-Liste. (Vieleicht stelle ich wml1 ja sogar ganz an den Anfang...)

          Weitere Infos zu diesem Thema findest du übrigens in den SELFHTML-Artikeln Alternative Dokumentinhalte via HTTP sowie Ermitteln der Sprache des Browsers.

          Desweiteren dachte ich analog zur "Dein Browser unterstützt keine Frames, get Netscape" einen text/plain auszugeben mit dem Inhalt:

          Das ist doch gar nicht nötig: Welcher Browser kann denn kein HTML _interpretieren_? Und selbst dem IE kannst du XHTML als HTML verkaufen.

          Das ist total unschön und auch verwerflich (ja, das weiß ich), aber ich betone, dass ich diese Technik für eine sehr private und unkommezielle Seite verwenden werde.

          Private Seite oder nicht ist vollkommen gleichgültig. Was ist dir lieber: Kunden oder die Freunde verprellen? Also, schreib vernünftigen Code und so viele Hacks sind es ja gar nicht, damit auch der IE etwas damit anfangen kann. Das „kauf dir nen Mac“ kannst du dir dann immer noch für zwischendurch aufheben.

          Das kann man aber auch programmiertechnisch eleganter lösen.
          Bestimmt, z.B. mit display:none oder die Fehler in eine Datenbank schreiben oder in eine Datei oder... ich habe den einfachsten Weg gewählt ^^

          Nein, der eleganteste Wert ist, erst gar keine Fehler entstehen zu lassen. Undefinierte Variablen oder Array-Werte kann man in PHP wunderbar mit empty() oder array_key_exists() überprüfen.

          Viele Grüße,
          Robert

        2. Hallo

          Desweiteren dachte ich analog zur "Dein Browser unterstützt keine Frames, get Netscape" einen text/plain auszugeben mit dem Inhalt:

          Dein Browser unterstuetzt kein gaengiges hypertext-Format.

          also das typische "Ich bin leider nicht in der Lage, gängiges HTML zu schreiben, außerdem benutzt Du einen Browser, den ich nicht mag. Ändere Du das gefälligst, denn ich bin dazu nicht bereit."

          Nein, ich kann praktisch keine Deiner Folgerungen und Aussagen in diesem Thread nachvollziehen.

          Ja, ich halte es für eine kontraproduktive Idee, auf irgendeiner Webseite - privat oder kommerziell - solche oder ähnliche Hinweise anzubringen.

          Freundliche Grüße

          Vinzenz, der am liebsten Firefox benutzt und oft allergisch auf Bashing reagiert.

          1. Hallo

            Hallo (sorry, dass ich die Antwort erst jetzt sehe)

            Desweiteren dachte ich analog zur "Dein Browser unterstützt keine Frames, get Netscape" einen text/plain auszugeben mit dem Inhalt:

            Dein Browser unterstuetzt kein gaengiges hypertext-Format.

            also das typische "Ich bin leider nicht in der Lage, gängiges HTML zu schreiben, außerdem benutzt Du einen Browser, den ich nicht mag. Ändere Du das gefälligst, denn ich bin dazu nicht bereit."

            Nein, nein, da hast du mich völlig falsch verstanden, im Grunde sage ich "Ich bin in der Lage, gängiges HTML zu schreiben, allerdings benutzt du einen Browser, der sagt, dass er kein HTML (und kein XHTML und kein WML) kann. Besorg' dir einen Browser der das kann/tut, denn ich bin nicht dazu bereit zu raten was er kann."

            Nein, ich kann praktisch keine Deiner Folgerungen und Aussagen in diesem Thread nachvollziehen.

            Du kannst nicht nachvollziehen, dass ich es begrüßen würde, wenn Browser alle Inhaltstypen, die sie interprettieren können _explizit_ erwähnen? Hm, ok, muss ich mit leben ^^

            Ja, ich halte es für eine kontraproduktive Idee, auf irgendeiner Webseite - privat oder kommerziell - solche oder ähnliche Hinweise anzubringen.

            Das ist es!

            Freundliche Grüße

            freundlichen Gruß zurück.

            1. Moin!

              Nein, nein, da hast du mich völlig falsch verstanden, im Grunde sage ich "Ich bin in der Lage, gängiges HTML zu schreiben, allerdings benutzt du einen Browser, der sagt, dass er kein HTML (und kein XHTML und kein WML) kann.

              Ich finde es erstaunlich, wie du trotz mittlerweile besseren Wissens darauf beharrst, „Accept: */*“ falsch zu verstehen. „*/*“ heißt, dass der Useragent mit _allen Inhaltstypen_ umgehen kann, das schließt „text/html“ mit ein. Nach deiner _Interpretation_ dürftest du einem Browser, der dir „Accept: */*“ mitteilt, gar nichts ausliefern, weil du dir noch einmal sicher sein könntest, dass er z.B. mit text/plain etwas anfangen kann.

              Du kannst nicht nachvollziehen, dass ich es begrüßen würde, wenn Browser alle Inhaltstypen, die sie interprettieren können _explizit_ erwähnen?

              Mit „*/*“ erwähnt der Browser explizit, dass er alle Inhaltstypen mag. Wo ist also dein Problem?

              Kann es sein, dass du einfach eine neue Variante des IE-Bashings ausprobierst?

              Schönen Sonntag,
              Robert

              1. Moin!

                'nAbend

                Kann es sein, dass du einfach eine neue Variante des IE-Bashings ausprobierst?

                Ja!

                Ich finde es erstaunlich, wie du trotz mittlerweile besseren Wissens darauf beharrst, „Accept: */*“ falsch zu verstehen. „*/*“ heißt, dass der Useragent mit _allen Inhaltstypen_ umgehen kann, das schließt „text/html“ mit ein. Nach deiner _Interpretation_ dürftest du einem Browser, der dir „Accept: */*“ mitteilt, gar nichts ausliefern, weil du dir noch einmal sicher sein könntest, dass er z.B. mit text/plain etwas anfangen kann.

                1. Ja ich habe (schon wieder) das Wörtchen "explitit" vergessen.
                2. Ja richtig, davon müsse ich nach meiner Interpretation ausgehen, wobei ich natürlich weiß, dass */* _alles_ bedeutet aber diese Unzulänglichkeit an Information nicht in Kauf/einfach hin nehmen möchte.

                Du kannst nicht nachvollziehen, dass ich es begrüßen würde, wenn Browser alle Inhaltstypen, die sie interprettieren können _explizit_ erwähnen?
                Mit „*/*“ erwähnt der Browser explizit, dass er alle Inhaltstypen mag. Wo ist also dein Problem?

                Mangel an Information (siehe oben).

                1. Moin!

                  Kann es sein, dass du einfach eine neue Variante des IE-Bashings ausprobierst?
                  Ja!

                  Damit erübrigt sich meine weitere Teilnahme an dieser Diskussion.

                  Viele Grüße,
                  Robert