Serverrückgabe Zeichensatz ermitteln

kramoo

Mitglied
Muss zwei string vergleichen. Dabei habe ich das Problem das ein mal der string aus der Datenbank kommt wo alles UTF-8 codiert ist zum anderen kommt der string von verschiedenen Webseiten wo ich nicht weiß ob diese UTF-8 oder ISO-8859-1 ist.

Das heißt ich müsste zuerst irgendwie ermitteln welcher Zeichensatz die Serverrückgabe verwendet und wenn nicht UTF-8 dann in UTF-8 codieren da sonst der Stringverlgeich nicht funktioniert.

Habe aber dazu nicht wirklich eine Lösung finden können? Kennt Ihr eine Möglichkeit?
 
Du kannst den HTTP-Header auslesen, der vom Server zurück kommt, von dem die Seite abgeholt wird. Wie das geht, hängt masßgeblich davon ab, wie du die Seiten abholst. Im alleräußersten Fall könnte man noch versuchen, mb_check_encoding zu verwenden, davon rate ich aber ab. Die Ergebnisse könnten falsch sein. Das funktioniert aber nur, wenn die Erweiterung mbstring (multi-byte-string) in PHP aktiv ist (siehe phpinfo()).

Allerdings musst du dich ebenfalls darauf verlassen können, das der Remote-Webserver das korrekte Encoding liefert.

Aber es ist rätselraten, bis du erklärst, wie du die Seiten abholst.
 
OK.
Hole die Seiten mittels cUrl ab. Dazu simuliere ich einen Browser.
Verwende auch $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; dazu.
Danach werden die Links aus der Seite mit dem Link in meiner DB verglichen. Und da habe ich das Problem das bei Sonderzeichen der Linktext nicht übereinstimmt.
 
Was sagt

PHP:
$response_headers = curl_getinfo($ch);
echo "<pre>";
var_dump($response_headers);
echo "</pre>";

nach dem curl_exec() aufgerufen wurde?

EDIT: das $ch muss natürlich durch dein curl-Handle ersetzt werden.

EDIT2: Ich habe noch vergessen, zu erwähnen, das folgende Zeile noch vor dem curl_exec() vorhanden sein muss:

PHP:
curl_setopt($ch, CURLOPT_HEADER, 1);

Auch hier wieder $ch durch die Variable ersetzen, die bei dir das Curl-Handle repräsentiert.
 
Zuletzt bearbeitet:
hmm ist anscheinend UTF-8 :-(
Dann muss ich noch etwas mehr erklären weil ich gerade nicht mehr weiß woran es noch liegen kann.

Habe zwei seiten als Beispiel die ich auslese und den Linktext vergleiche.

Seite 1 wird Umlaut richtig angezeigt im Linktext:

Ausgabe Linktext in eine TEXTDATEI:
Ökostrom

Ausgabe var_dump($response_headers);
Code:
array(21) {
  ["url"]=>
  string(87) "http://oekostrom-vergleich.org/vorne-dabei-beim-oekostromvergleich-die-stadtwerke-husum"
  ["content_type"]=>
  string(24) "text/html; charset=UTF-8"

Seite 2 wird Umlaut nicht richtig dargestellt im Linktext:

Ausgabe Linktext in eine TEXTDATEI:
günstiger Stromanbieter

Ausgabe var_dump($response_headers);
Code:
array(21) {
  ["url"]=>
  string(133) "http://www.strompreisvergleich-kostenlos.de/blog/490/490_teldafax-undndash%3B-einst-ein-guenstiger-stromanbieter-heute-insolvent.html"
  ["content_type"]=>
  string(24) "text/html; charset=UTF-8"

Anbei der Codeauszug:
Code:
function ... 
{
		$url = 'http://www.strompreisvergleich-kostenlos.de/blog/490/490_teldafax-undndash%3B-einst-ein-guenstiger-stromanbieter-heute-insolvent.html';
		$header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
		$header[] = "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";
		$header[] = "Accept-Encoding: gzip,deflate";
		$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
		$header[] = "Keep-Alive: 115";
		$header[] = "Connection: keep-alive";
		$header[] = "Pragma: no-cache";
		$header[] = "Cache-Control: no-cache";

		$cookie = tempnam ("../tmp", "CURLCOOKIE");
		$ch = curl_init();
		curl_setopt( $ch, CURLOPT_URL, $url );
		curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1" );
		curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
		curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
		curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
		curl_setopt( $ch, CURLOPT_ENCODING, 'gzip,deflate' );
		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
		curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
		curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
		curl_setopt( $ch, CURLOPT_TIMEOUT, 10 );
		curl_setopt( $ch, CURLOPT_MAXREDIRS, 5 );

  $html = curl_exec($ch); // führt curl aus
	
	/*$response_headers = curl_getinfo($ch);
	echo "<pre>";
	var_dump($response_headers);
	echo "</pre>";*/
	
  curl_close($ch); // schließt curl wieder

  return $html; // gibt den Inhalt der Seite zurück 
} // schließt die Funktion 

// Abarbeiten und prüfen aller Links mit der do while Schleife
do { 

$html = get_url($backlink_url); // funktion aufrufen cUrl und Übergabe der Backlinkurl

// parse the html into a DOMDocument
$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");


    for ($i = 0; $i < $hrefs->length; $i++) {

    $href = $hrefs->item($i);
    $url = $href->getAttribute('href');
    $ankertext = $href->nodeValue;
 						
   echo $ankertext;

Wenn ich die Links ohne Header und Zeichensatz ausgeben lasse sehen sie so aus.
Ökostrom
günstiger Stromanbieter

Der erste ist UTF-8 oder?
Aber was ist mit dem zweiten Link?
 
Zuletzt bearbeitet:
Also mit diesem PHP-Code kommen alle Zeichen bei mir korrekt im Browser an:

PHP:
<?php
header('Content-Type: text/html; charset=utf-8');
function get_url($url)
{
	$header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
	$header[] = "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";
	$header[] = "Accept-Encoding: gzip,deflate";
	$header[] = "Accept-Charset: iso-8859-1,utf-8;q=0.7,*;q=0.7";
	$header[] = "Keep-Alive: 115";
	$header[] = "Connection: keep-alive";
	$header[] = "Pragma: no-cache";
	$header[] = "Cache-Control: no-cache";

	$cookie = tempnam ("../tmp", "CURLCOOKIE");
	$ch = curl_init();
	curl_setopt( $ch, CURLOPT_URL, $url );
	curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1" );
	curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
	curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
	curl_setopt( $ch, CURLOPT_ENCODING, 'gzip,deflate' );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
	curl_setopt( $ch, CURLOPT_TIMEOUT, 10 );
	curl_setopt( $ch, CURLOPT_MAXREDIRS, 5 );

	$html = curl_exec($ch); // führt curl aus

	/*$response_headers = curl_getinfo($ch);
	 echo "<pre>";
	var_dump($response_headers);
	echo "</pre>";*/

	curl_close($ch); // schließt curl wieder

	return utf8_decode($html); // gibt den Inhalt der Seite zurück
} // schließt die Funktion

$urls = array(
'http://www.strompreisvergleich-kostenlos.de/blog/490/490_teldafax-undndash%3B-einst-ein-guenstiger-stromanbieter-heute-insolvent.html',
'http://oekostrom-vergleich.org/vorne-dabei-beim-oekostromvergleich-die-stadtwerke-husum'
);

// Abarbeiten und prüfen aller Links mit der do while Schleife
foreach($urls as $url) {
	$html = get_url($url); // funktion aufrufen cUrl und Übergabe der Backlinkurl

	// parse the html into a DOMDocument
	$dom = new DOMDocument();
	@$dom->loadHTML($html);

	// grab all the on the page
	$xpath = new DOMXPath($dom);
	$hrefs = $xpath->evaluate("/html/body//a");


	for ($i = 0; $i < $hrefs->length; $i++) {

		$href = $hrefs->item($i);
		$url = $href->getAttribute('href');
		$ankertext = $href->nodeValue;

		echo $ankertext;
	}
}
 
Danke aber funktioniert leider nur bei diesen zwei Links.
Bei diesem Link 'http://www.vitabia.de/wellness/wellnesshotel-im-schwarzwald-erholung-und-natur-pur' bekomme ich gar keinen Linktext mehr angezeigt. Insgesamt habe ich ja mehr als 2.000 Links zum testen.

Problem macht das return utf8_decode($html); Werde mal versuchen utf8_decode etwas später vielleicht zu verwenden.
 
Zurück