Fremde HTML Seite laden, Umlaute?

Fremde HTML Seite laden, Umlaute?

am 04.09.2006 13:08:43 von Grischa Brockhaus

Hallo,

ich möchte gerne den HTML Code einer fremden Seite laden und durchsuchen. Im Prinzip klappt das ja
problemlos mit fopen oder fsockopen.

Nun habe ich aber das Problem, dass bei Seiten mit Umlauten (die einfach nur im Text stehen und
deren Codierung im Meta Tag angegeben wurde) bei mir im Stream einfach als Fragezeichen auftauchen.

Wie bekomme ich hier die korrekten Umlaute? Ich habe schon alles mögliche versucht, am Request
Header mitzugeben, aber alles ohne Erfolg, habe den Verdacht, dass ich da an der falschen Stelle
probiere.

Wie geht's also?

Vielen Dank für Hinweise,
Grischa

Re: Fremde HTML Seite laden, Umlaute?

am 04.09.2006 17:04:34 von Ulf Kadner

Grischa Brockhaus wrote:

> Nun habe ich aber das Problem, dass bei Seiten mit Umlauten (die einfach
> nur im Text stehen und deren Codierung im Meta Tag angegeben wurde) bei
> mir im Stream einfach als Fragezeichen auftauchen.

Es kommt *immer* darauf an was der Webserver als charset im Header
Content-Type: ... liefert.

Wenn z.B.: Content-Type: text/html; charset=iso-8859-1 geliefert wird,
aber das Webdokument in Wirklichkeit ein charset=utf-8 ist, so ist es
leicht möglich bzw. logisch das Du da inkorrekte Daten im Sinne des
Zeichsatzes bekommst.

Der Metatag zum content-type selbst ist hier irrelevant.

Wenns also utf-8 sein soll nimm einfach utf8_encode() für den
empfangenen Inhalt.

Keine wirkliche Alternative wäre die Verwendung bzw. das Senden
des Accept-Charset Headers. Der wird aber nicht von allen Webservern
unterstützt und ist daher keine gute Lösung.

Wenn Du z.B. sehen willst welche header der Server auf Deinen Request
sendest:

$fp = fsockopen('www.example.com', 80, $errno, $errstr, 30);
if (!$fp) die ("$errstr ($errno)
\n");
$out = "GET /article-1126081344.html HTTP/1.0\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$out = '';
while (!feof($fp)) { $out .= fgets($fp, 1024); }
fclose($fp);
list ($hdr, $out) = explode("\r\n\r\n", $out, 2);
echo '

',$hdr,'
';
#echo utf8_encode($out);

>
> Wie bekomme ich hier die korrekten Umlaute? Ich habe schon alles
> mögliche versucht, am Request Header mitzugeben, aber alles ohne Erfolg,
> habe den Verdacht, dass ich da an der falschen Stelle probiere.
>
> Wie geht's also?
>
> Vielen Dank für Hinweise,
> Grischa

Re: Fremde HTML Seite laden, Umlaute?

am 05.09.2006 13:10:15 von Grischa Brockhaus

Ulf Kadner schrieb:
> Es kommt *immer* darauf an was der Webserver als charset im Header
> Content-Type: ... liefert.

Okay. Was ist, wenn kein Charset vom Server übermittelt wird? Kann ich dann einfach mal von UTF-8
ausgehen, oder gibt es da dann noch andere Mechanismen, um das Charset zu erkennen?

> Wenn z.B.: Content-Type: text/html; charset=iso-8859-1 geliefert wird,
> aber das Webdokument in Wirklichkeit ein charset=utf-8 ist, so ist es
> leicht möglich bzw. logisch das Du da inkorrekte Daten im Sinne des
> Zeichsatzes bekommst.

Hmm.. Dann müsste ich in dem Fall dann doch noch mal das Meta Tag auslesen, um die Intention des
Seiteprogrammiers zu erkennen?

> Wenns also utf-8 sein soll nimm einfach utf8_encode() für den
> empfangenen Inhalt.

Was sind die Alternativen? Was nehme ich z.B. bei iso-8859-1?

> Keine wirkliche Alternative wäre die Verwendung bzw. das Senden
> des Accept-Charset Headers. Der wird aber nicht von allen Webservern
> unterstützt und ist daher keine gute Lösung.

Na, ich kann das ja immerhin mal mitgeben, damit bei Webservern, die das unterstützen, per default
UTF-8 rüber kommt.

So weit schon einmal VIELEN DANK! Allein das utf8_encode war schon hilfreich. Das benutze ich jetzt,
wenn ich UTF8 erkenne, also wenn das im Header Charset angegeben wurde, oder wenn kein Charset
angegeben wurde. Das läuft bei den Seiten, die ich getestet habe (die alle kein Charset
mitlieferten) ziemlich gut.

Grischa

Re: Fremde HTML Seite laden, Umlaute?

am 05.09.2006 14:13:57 von Ulf Kadner

Grischa Brockhaus wrote:

> Okay. Was ist, wenn kein Charset vom Server übermittelt wird?

Wenn wirklich keinerlei Charset im Content-Type Header geschickt wird
dann gilt utf8.

> dann einfach mal von UTF-8 ausgehen, oder gibt es da dann noch andere
> Mechanismen, um das Charset zu erkennen?

Wirklich 100%ig erkennen kannst Du es nie. Es gibt keine zuverlässige
Möglichkeit zu erkennen, was der Betreiber der Webseite da so ausgibt.
Das hängt zu großen Teilen auch von den Anwendungen ab, die den Output
generieren. Ein weiterer nicht unwichtiger Faktor ist das Wissen des
Webmasters der Seite über die Verwendung korrekter Zeichensätze etc.

> Hmm.. Dann müsste ich in dem Fall dann doch noch mal das Meta Tag
> auslesen, um die Intention des Seiteprogrammiers zu erkennen?

Ja aber ob das denn dan auch so stimmt ist halt nicht gewährleistet.

Das erweckt bei mir den Anschein als wölltest Du beliebige Seiten so
einlesen + ausgeben.

Da sollte ein Hinweis auf rechtliche Aspekte nicht fehlen.

In den allerwenigsten Fällen ist das was Du da machst auch erlaubt! Wenn
die Webseite nicht ausdrücklich darauf hinweist, das die Nutzung von
deren Inhalten auf anderen/fremden Webseiten erlaubt ist, begibst Du
dich ganz fix ins rechtliche Abseits! Das kann wirklich böse enden u.U.
seeehr teuer werden. Entweder Du fragst im Zweifelsfall den
Webseitenadministrator oder Du läst es besser.

Es ist für einen gute Administrator auch meist kein Problem schwarze
Schafe zu finden, auszugrenzen und zu lokalisieren.

MfG, Ulf

Re: Fremde HTML Seite laden, Umlaute?

am 05.09.2006 17:48:15 von Norbert Melzer

Am Tue, 05 Sep 2006 14:13:57 +0200 schrieb Ulf Kadner:

> Grischa Brockhaus wrote:
>
>> Okay. Was ist, wenn kein Charset vom Server übermittelt wird?
>
> Wenn wirklich keinerlei Charset im Content-Type Header geschickt wird
> dann gilt utf8.

Auszug aus RFC 2616 [1]:

3.7.1 Canonicalization and Text Defaults
[...]
The "charset" parameter is used with some media types to define the
character set (section 3.4) of the data. When no explicit charset
parameter is provided by the sender, media subtypes of the "text" type
are defined to have a default charset value of "ISO-8859-1" when
received via HTTP.
[...]

Ich lese daraus das bei fehlender Charsetangabe ISO-8859-1 gilt und
NICHT UTF-8

Fußnoten:
[1] ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt
--
Link zur PHP-FAQ http://www.php-faq.de

Re: Fremde HTML Seite laden, Umlaute?

am 05.09.2006 18:13:35 von Grischa Brockhaus

Ulf Kadner schrieb:
>> Okay. Was ist, wenn kein Charset vom Server übermittelt wird?
>
> Wenn wirklich keinerlei Charset im Content-Type Header geschickt wird
> dann gilt utf8.

Wunderbar, dann ist das ja so, wie ich das jetzt implementiert habe.

> Das erweckt bei mir den Anschein als wölltest Du beliebige Seiten so
> einlesen + ausgeben.

So ist das in der Tat, aber siehe unten..

> Da sollte ein Hinweis auf rechtliche Aspekte nicht fehlen.
> In den allerwenigsten Fällen ist das was Du da machst auch erlaubt! Wenn
> die Webseite nicht ausdrücklich darauf hinweist, das die Nutzung von
> deren Inhalten auf anderen/fremden Webseiten erlaubt ist, begibst Du
> dich ganz fix ins rechtliche Abseits! Das kann wirklich böse enden u.U.
> seeehr teuer werden. Entweder Du fragst im Zweifelsfall den
> Webseitenadministrator oder Du läst es besser.

Ja. Das ist natürlich völlig richtig.

Allerdings geht es hier um ein Portal, was in einem bestimmten Zusammenhang Themen von sehr
speziellen anderen Seiten zusammen fässt. Die Leute, die diese Seiten einbinden sind genau die
Administratoren der Seiten, die eingebunden werden (so ist es jedenfalls gedacht, wenn dort auch
noch etwas anderes eingebunden wird, bewege ich mich hoffentlich nicht als Entwickler des
Mechanismus im rechtsfreien Raum sondern der, der eingebunden hat).

Aber danke für den Hinweis, das werde ich den Benutzern meiner Software noch einmal Explizit mitgeben!

Wie immer waren Deine Hinweise sehr hilfreich, vielen Dank!

Grischa

Re: Fremde HTML Seite laden, Umlaute?

am 05.09.2006 18:15:26 von Grischa Brockhaus

Hmm, danke für den Hinweis..

Gibt es ein Äquivalent für utf8_encode, das bei ISO-8859-1 funktioniert?
Zur Zeit gehe ich noch von UTF-8 als Default aus, was funktioniert. Sogar bei solchen Seiten, wo im
Metatag etwas anderes vom jeweiligen Entwickler notiert wurde..

Norbert Melzer schrieb:
>>> Okay. Was ist, wenn kein Charset vom Server übermittelt wird?
>> Wenn wirklich keinerlei Charset im Content-Type Header geschickt wird
>> dann gilt utf8.
>
> Auszug aus RFC 2616 [1]:
>
> 3.7.1 Canonicalization and Text Defaults
> [...]
> The "charset" parameter is used with some media types to define the
> character set (section 3.4) of the data. When no explicit charset
> parameter is provided by the sender, media subtypes of the "text" type
> are defined to have a default charset value of "ISO-8859-1" when
> received via HTTP.
> [...]
>
> Ich lese daraus das bei fehlender Charsetangabe ISO-8859-1 gilt und
> NICHT UTF-8
>
> Fußnoten:
> [1] ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt

Re: Fremde HTML Seite laden, Umlaute?

am 05.09.2006 18:45:22 von Ulf Kadner

Norbert Melzer wrote:

>>Wenn wirklich keinerlei Charset im Content-Type Header geschickt wird
>>dann gilt utf8.
>
> Auszug aus RFC 2616 [1]:
>
> 3.7.1 Canonicalization and Text Defaults
> [...]
> The "charset" parameter is used with some media types to define the
> character set (section 3.4) of the data. When no explicit charset
> parameter is provided by the sender, media subtypes of the "text" type
> are defined to have a default charset value of "ISO-8859-1" when
> received via HTTP.
> [...]
>
> Ich lese daraus das bei fehlender Charsetangabe ISO-8859-1 gilt und
> NICHT UTF-8

Ja ich kenn das auch so. Aber bei PHP scheints da nicht gemäß der RFC
implementiert zu sein.

Ich habs gestern extra mal getestet.

- Webserver so konfiguriert das definitiv kein Charset definiert ist
- echo file_get_contents('http://nocharset/test.py');
- Umlaute werden definitiv korrekt dargestellt. Woraus ich schliesse das
hier meine Annahme zutrifft.

Getestet auf nem MAC mit Indianer 2.1 + PHP 5.1.4

MfG, Ulf

Re: Fremde HTML Seite laden, Umlaute?

am 06.09.2006 11:12:10 von Ulf Kadner

Grischa Brockhaus wrote:

> Allerdings geht es hier um ein Portal, was in einem bestimmten
> Zusammenhang Themen von sehr speziellen anderen Seiten zusammen fässt.
> Die Leute, die diese Seiten einbinden sind genau die Administratoren der
> Seiten, die eingebunden werden (so ist es jedenfalls gedacht, wenn dort
> auch noch etwas anderes eingebunden wird, bewege ich mich hoffentlich
> nicht als Entwickler des Mechanismus im rechtsfreien Raum sondern der,
> der eingebunden hat).

Hallo Grischa!

Naja... Du als Entwickler meist nicht. Es ist aber unabdingbar
unbedarfte Nutzer auf evtl. entstehende Probleme hinzuweisen.

Du solltest hier auf jeden Fall einen Mechanismus implementieren, der
dem Nutzer Deiner Anwendung genügend Werkzeuge an die Hand gibt, mit
denen er evtl. auftauchende Bösewichte gezielt ausschliessen kann.
Und wenns als käufliche Erweiterung ist, egal

Es ist ja im Endeffekt so, das jeder Webseitenbetreiber für *alle*
Inhalte, die von Seiner Webseite ausgeliefert werden die eigene Hand ins
Feuer halten muss. Wenn Du ihm dann eine evtl. undurchdachte Lösung
präsentierst, ist die Nutzung derer zwar immer noch sein Problem, aber
Deins wirds damit auch spätestens dann, wenn keiner mehr Interesse an
Deiner Software hat.

Sicherheitsmechanismen die mir dazu so auf die Schnelle einfallen wären:

- Moderationstools (also z.B. neue Webseiteneinbindungen nur nach der
Freigabe eines Vertrauenswürdigen Moderators der Öffentlichkeit
präsentieren)
- Filter (z.B.: Badword-Filter) die bereits bei Einbindung den Inhalt
checken und ggf. als unzulässig markieren

Und da gibts noch viele weitere Möglichkeiten die natürlich stark von
der Anwendung abhängig sind.

MfG, Ulf