A A A i

lundi  3 juillet 2006lundi 3 juillet 2006

Charset detection routine in PHP with Snoopy

Sometimes you can't leave everything being done automatically, like for instance the charset detection when you retrieve something from the web. With HTML and XML, those can be overidden inside the file, and this can be tricky (especially since you must give the correct encoding to the XML parser before giving to it the file). So, here is what I basically use in Radio.Blog to PLS. The depencies are Snoopy the HTTP client library, and a HTML Parser written by Jose Solorzano (unfortunately we don't have TagSoup in PHP). It's crude, but works... here we go:

function url_get_contents($url) {
  $snoopy = new Snoopy;

  $c_data = read_cache($url);

  // [...]
  
  if($snoopy->fetch($url)) {
    $c_data['status'] = $snoopy->status;
    $c_data['charset_embedded'] = false;
    if($snoopy->status == 200) {
      $c_data['charset'] = 'iso-8859-1';
      foreach($snoopy->headers as $header) {
	@list($key,$val) = preg_split('/[: ]+/', $header, 2);
	$val = trim($val);
	$key = strtolower($key);
	switch($key) {
	// [...]
	  case 'content-type':
	  $parts = preg_split('/[ ;=]+/', $key, 3);
	  $c_data['type'] = $parts[0];
	  if(isset($parts[1])) {
	    $c_data[$parts[1]] = $parts[2];
	  }
	  break;
	}
      }
      
      $c_data['content'] = $snoopy->results;
      $charset_found = false;

      // is is raw XML? don't trust the Content-Type header
      $off = strpos($c_data['content'], 'status != 304) {
      if($snoopy->status >= 400 && $snoopy->status < 500) {
	$c_data['error'] = true;
      } else if($snoopy->status >= 500 && $snoopy->status < 600) {
	$c_data['error'] = true;
      }
      // other error... what can we do?
    }
  } else {
    // dooh
  }
  
  return $c_data;
}

function charsetFromHTML(&$c_data) {
  // is it really HTML? We don't even know...
  $subdoc = stristr($c_data['content'], '');
    if($off2 === false) {
      $off2 = strpos($subdoc, '');
    }
    if($off2 !== false) {
      $parser = new HtmlParser(substr($subdoc, 0, $off2 + 7));
	    
      while ($parser->parse()) {
	if($parser->iNodeType == NODE_TYPE_ELEMENT && strtolower($parser->iNodeName) == 'meta') {
	  if(isset($parser->iNodeAttributes['http-equiv'])) {
	    if(!strcasecmp($parser->iNodeAttributes['http-equiv'], 'content-type')) {
	      $parts = preg_split('/[ ;=]+/', $parser->iNodeAttributes['content'], 3);
	      $c_data['type'] = $parts[0];
	      if(isset($parts[1])) {
		$c_data[$parts[1]] = $parts[2];
	      }
	      break;
	    }
	  }
	} else if($parser->iNodeType == NODE_TYPE_ELEMENT && strtolower($parser->iNodeName) == 'body') {
	  break;
	} else if($parser->iNodeType == NODE_TYPE_ENDELEMENT && strtolower($parser->iNodeName) == 'head') {
	  break;
	}
      }
    }
  }
}

(Cyberpunk, 2006/07/03 22:07) lien permanent

A Pékin, j'ai rencontré Little Bouddah

Little Bouddah On dit que la Grande Muraille est visible depuis l'espace. On dit aussi que la Chine est le nouvel Eldorado. Et on dit encore que les chinois vont tous nous bouffer. Et pourtant on sait pertinnement que les chinois ne sont pas anthropophages. Ils mangent des chats, d'accord, mais peut-on vraiment le leur reprocher ? Comme dirait un france-qui-tombeut primaire (oui, c'est une lapalissade) : ils ont compris, eux.

A Pékin, ou 北京(Beijing), la fin du monde arrive plus vite qu'à Shanghaï : pour eux c'est en 2008, ici c'est en 2010. Pourtant, ils n'ont pas l'air d'être plus affolés que ça. A Pékin, on est plus près de la Grande Muraille, plus près des lieux des pouvoirs, plus près des chinois et plus près de la pollution. A Pékin il n'y a pas de rues ; les grandes avenues transpercent la capitale, faisant passer les Champs-Elysées pour une voie communale, tandis que les ruelles sont réservées aux 胡同 (hutong), les quartiers traditionnels. Les périphériques rythment la traversée de la ville ; les pékinois arrivent à en compter pratiquement sept, personnellement je m'arrête à trois. Pékin, à l'image de Shanghaï, ou l'inverse, est une ville-province ; la ville grossit, absorbe peu à peu les villes environnantes qui deviennent des nouveaux districts. Ces villes tentaculaires ne le sont qu'administrativement, peut-on parler d'unité quand il faut deux heures de transport pour aller d'un point à un autre ? C'est pourquoi je m'arrête à trois. C'est pourquoi je considère que Shanghaï n'est pas une ville si étendue que ça.

L'étendue, cela caractérise plutôt Pékin. Une ville plate (comme une chinoise), avec ses collines artificielles (comme une chinoise aussi), ses grands espaces si vides (les routes) mais si pleins à la fois (la circulation). Si Shanghaï est verticale, plantant ses grattes-ciel comme d'autres ouvrent les couloirs de bus, Pékin est assurément horizontale. Même si les immeubles sont présents, le ciel reste présent et l'horizon se laisse deviner. Et celà agit sur le temps aussi, le temps pékinois est plus humain, moins pressé, moins abrupt qu'à Shanghaï. A Shanghaï les hutongs sentent le renfermé ; étroits et souvent ouverts en un seul point stratégique, ils sont la fin d'un voyage. A Pékin par contre, leurs rues suffisamment large et leurs ouvertures en font les lieus de prédiléction pour les ballades, permettant d'oublier ces grandes avenues qui crient au piéton "disparaît !". Mais 2008 approche, et peut-être qu'une partie de tout ça prendra fin.

(Champ Aïl, 2006/07/03 01:35) lien permanent

Commentaires ici et ailleurs :

Je confirme, c'est grand et plat, et a part pour la circulation, moins stressant qu'à Shanghai... Par contre, 2008, c'est que dans deux ans, et je suis pas sur que ca soit suffisament clean pour satisfaire les milliers de portefeuilles sur pattes qui arriveront a ce moment là... Enfin bon... les chinois travaillent vite, ca sera peut etre tout a fait presentable en 2008...

Posté par Quentin, le mercredi 2 août 2006 à 09:11 #

J'arrive !

La paix arrive sur le monde

Et n'oubliez pas d'aller voir les galleries...(Regional news, 2006/07/03 00:35) lien permanent

Commentaires ici et ailleurs :

Il est vivant ! ça fait plaisir de te voir un peu sur ton blog.

Posté par Fabien, le jeudi 6 juillet 2006 à 22:29 #

Oui enfin parle pour toi. Perso je venais juste de manger...

Posté par Zap, le vendredi 7 juillet 2006 à 00:52 #

Zap, tu me paieras cette infâmie :-)

Posté par Damien B, le vendredi 7 juillet 2006 à 05:51 #


qui est

nom : Damien Bonvillain
courriel : kame à cinemasie.com
bloggercode:
B9 D+ T+ K S F I- O X+ E- L- C-- Y1 R+ W- P+ M5 N-- N+
un peu plus : Google Whoring tortue

Messagerie instantanée

    les koms

    m'enfin

    Quant à mes invectives imaginaires, je vous laisse chercher un endroit adéquat pour les ranger. Elles craignent la lumière, si vous voulez une piste.
    Lien associé
    Eolas - « Aimez moi, c'est un ordre. »

    les bons vieux


    archives

    « juillet 2006 »
    lunmarmerjeuvensamdim
    12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31

    XML RSS 2.0 XML RSS 2.0 commentaires A A A i

    liens

    allégeance

    Blog sans chat

    colophon

    Propulsé par pointClairMerci à la caféineDevelopment with EmacsBadges from GTMcKnightFreeListed on BlogSharesGeoURL