Détecter automatiquement l’encodage d’une page en PHP

Si vous utilisez Simple HTML Dom Parser, vous avez certainement été confrontés au problème de la détection de l’encodage de la page parsée pour éviter toutes les erreurs avec les caractères spéciaux. Vous pourrez trouver dans cet article la majorité des fonctions que j’ai pu tester (pas convaincantes pour tous les sites) et une fonction maison, qui jusqu’à présent à pu corriger les problèmes trouvés sur les autres fonctions.

Variantes avec mb_detect_encoding ou iconv…

Passez votre chemin, la fonction ne fonctionnera que dans de très rares cas …

Les regExp: Une bonne fonction à débugger

Je suis tombé sur cette fonction qui est très propre. La fonction fonctionne très bien mais omet les cas où le développeur du site a oublié de mettre des quotes ou double-quotes après charset=.

Si jamais vous arrivez à la debugger, je suis preneur.

function _get_html_encoding_extra($raw_text){

    preg_match( "/charset=[\"|\'](.+?)[\"|\']/", $raw_text, $matches );
    
    return strtoupper($matches[1]);
}

// SRC: http://www.zimplicit.se/knowledge/how-get-charset-html-code-simplehtml-dom

Fonction maison pour détecter l’encodage d’une page

Voici donc la fonction que j’utilise pour détecter l’encodage de la page. Pas d’erreur constatée pour l’instant, mais sa construction n’est pas optimale.

function detection_encodage($source){
	$debut=strpos (  $source, "html; charset=");
	if ($debut>1){
			$suite=$debut+14;
			if (substr($source,$suite,1)=='"'){
					$suite++;
					$fin=strpos(substr($source,$suite),'"');
			}elseif (substr($source,$suite,1)=="'"){
					$suite++;
					$fin=strpos(substr($source,$suite),"'");
			}else{
					$fin1=strpos(substr($source,$suite+1),"'");
					$fin2=strpos(substr($source,$suite+1),'"');
					if ($fin1>0){
							if($fin2>0){
									$fin=min($fin1, $fin2);
							}else{
									$fin=$fin1;
							}
					}else{
							$fin=$fin2;
					}
			}
			$return=substr($source,$suite,$fin+1);
	}else{
		$return="UTF-8";
	}
	return strtoupper($return);
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *