IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Charset et encodage selon encodage d'une url [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut Charset et encodage selon encodage d'une url
    Bonjour, j'utilise deux fonctions pour scrapper une url, mon soucis est d'afficher le texte scraper dans le bon encodage

    Si le texte de l'url scrappé est en UFT-8, pas de soucis, par contre s'il est en ISO-8859-1 ou ISO-8859-15 ou windows-1252 ou autre.... J'ai évidemment un problème d'affichage dans le texte.

    Quel serait la meilleure solution, récupérer le charset et selon ce qu'il trouve faire le bon encodage / décodage ? ou et j'ai pas réussi, découvrir l'encodage du texte et le corriger en fonction ?
    Dans les deux cas, j'ai pas trouvé comment..

    Je n'ai pas réussi a récupérer le charset avec cette fonction et la découverte de l'encodage ne donne pas satisfaction

    Merci pour votre aide
    Cordialement
    yule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    <?php
     
    // +------------------- File_Get ---------------------+
     
    		function getMyData($site){
    			return file_get_contents($site);
    		}
     
    // +------------------- Scrapper l'url ---------------------+
     
    		function spiderView($url,$err_str="Cette url n'est pas valide pour cette fonction !") 
    		{
    			// Appel à la fonction file_get
    			$html = getMydata($url); 
     
    			if($html == ""){
    			die($err_str); // Si l'url est pas bonne, affiche l'erreur  
    			}
     
    			// La source de l'url
    			$sourceData = $html; 
     
    			// Pour avoir que du texte
    			$textData = preg_replace('/(<script.*?>.*?<\/script>|<style.*?>.*?<\/style>|<.*?>|\r|\n|\t)/ms', '', $html);  
    			$textData = preg_replace('/ +/ms', ' ', $textData);  
     
    			//Selon et /ou avec des majuscules dans les metas
    			$html = str_ireplace(array("Title","TITLE"),"title",$html);
    			$html = str_ireplace(array("Description","DESCRIPTION"),"description",$html);
    			$html = str_ireplace(array("Keywords","KEYWORDS"),"keywords",$html);
    			$html = str_ireplace(array("Content","CONTENT"),"content",$html);  
    			$html = str_ireplace(array("Meta","META"),"meta",$html);  
    			$html = str_ireplace(array("Name","NAME"),"name",$html);  
     
    			$doc = new DOMDocument();
    			@$doc->loadHTML($html);
     
    			$nodes = $doc->getElementsByTagName('title');
    			$title = $nodes->item(0)->nodeValue;
    			$metas = $doc->getElementsByTagName('meta');
     
    			for ($i = 0; $i < $metas->length; $i++)
    			{
    			$meta = $metas->item($i);
    			if($meta->getAttribute('name') == 'description')
    			   $description = $meta->getAttribute('content');
    			if($meta->getAttribute('name') == 'keywords')
    				$keywords = $meta->getAttribute('content');
    			}
     
    			//Vérifier les données vides
    			$site_title = ($title == '' ? "Pas de titre..." : $title);
    			$site_description = ($description == '' ? "Pas de description..." : $description);
    			$site_keywords = ($keywords == '' ? "Pas de keywords..." : $keywords);
     
    			$arr_meta = array($site_title,$site_description,$site_keywords,$textData);
    			return $arr_meta;
    		}
     
     
    	$url2 = "https://www.developpez.com/";  // l'url pour le test
    	$html2 =  spiderView($url2); // appel à la fonction
    	$texte1 = $html2[3]; //déclarer pour réutiliser par la suite
     
    	echo"$texte1";
     
    // + ----------- mes essais.....--------+
     
    	//$texte1 = html_entity_decode("$texte1", ENT_QUOTES); // 
     
    	//if (preg_match("/é|Ã|ô|â|î|è|ê/i", "$texte1")) 
    	//		{
    	//			$texte1 = utf8_encode($texte1);
    	//		} 
     
    	//echo htmlentities($texte1, ENT_QUOTES);
    	//$texte1 = utf8_encode($texte1);
    	//$texte1 = utf8_decode($texte1);
    	//echo mb_detect_encoding($texte1);
     
    ?>

  2. #2
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    C'est tout bon avec ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte1 = iconv(mb_detect_encoding($texte1), "UTF-8//TRANSLIT//IGNORE", $texte1);

  3. #3
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    Re,


    Ah ben non ... je perds les accents

    le texte original :
    Je d�couvre J'ouvre un compte en ligne Pratique Aide et d�mo Nouveau Netbanking

    J'arrive à ceci
    je dcouvre j'ouvre un compte en ligne pratique aide et dmo nouveau netbanking

    Au lieu de
    je découvre j'ouvre un compte en ligne pratique aide et démo nouveau netbanking

    Donc cette solution est bancale...

    Merci si vous avez une idée
    Yule

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu utilises les options TRANSLIT et IGNORE en même temps, mais pour moi, les deux sont mutuellement exclusives: soit on remplace les caractères non trouvés par le caractère approchant, soit on le supprime.
    Essaye avec uniquement TRANSLIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte1 = iconv(mb_detect_encoding($texte1), "UTF-8//TRANSLIT", $texte1);

  5. #5
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    Hello,

    Merci mais dans mon utilisation çà ne fonctionne pas comme ça le devrait, toutefois, j'ai trouvé ceci qui à l'air de bien fonctionner dans mon utilisation

    Donc si ça peut être utile....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    <?php
    // +------------------- Definir l'encodage et l'adapter !!-------------------+
     
    		if ( !function_exists('mb_detect_encoding') ) 
    		{ 
    			function mb_detect_encoding ($string, $enc=null, $ret=null) 
    			{ 
    		   		static $enclist = array( 
    					'UTF-8', 'ASCII', 
    					'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 
    					'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', 
    					'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16', 
    					'Windows-1251', 'Windows-1252', 'Windows-1254', 
    					);
     
    				$result = false; 
     
    				foreach ($enclist as $item) 
    				{ 
    					$sample = iconv($item, $item, $string); 
    					if (md5($sample) == md5($string)) 
    					{ 
    						if ($ret === NULL) { $result = $item; } else { $result = true; } 
    						break; 
    					}
    				}
    				return $result; 
    			} 
    		} 
     
    // +------------------- Definir l'encodage et l'adapter, appeler la fonction ci-dessus !!-------------------+
     
    		function str_to_utf8 ($str) 
    		{ 
    			if (mb_detect_encoding($str, 'UTF-8', true) === false) 
    			{ 
    				$str = utf8_encode($str); 
    			}
    			return $str;
    		}
     
    $texte1 = str_to_utf8($texte1);
     
    ?>
    Encore merci et bonne soirée
    Yule

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Citation Envoyé par Celira Voir le message
    Tu utilises les options TRANSLIT et IGNORE en même temps, mais pour moi, les deux sont mutuellement exclusives.
    Pas forcément. En fait ces options sont prises en compte dans l'ordre, c'est à dire que tout ce qui n'a pas pu être transformé (les octets illégaux dans l'encodage d'origine) est alors supprimé. Par exemple si je construis une chaîne UTF-8 et que j'y introduis un octet en dehors de la plage ASCII \x00-\x7f:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo iconv('UTF-8', 'ASCII//TRANSLIT', "âœ\xc3ç");
    // PHP Notice:  iconv(): Detected an illegal character in input string in ...
     
    echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', "âœ\xc3ç");
    // aoec
    Par contre si je veux convertir n'importe quoi, disons de l'ISO-8859-1, en UTF-8, TRANSLIT devient inutile car tous les caractères de l'ISO-8859-1 sont codables en UTF-8. IGNORE quant à lui reste utile lorsque l'encodage d'origine a des trous comme WINDOWS-1252, ce qui fait qu'une chaîne peut contenir des octets illégaux (\x81 par exemple).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encodage d'une URL
    Par GameMaster1337 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/07/2013, 12h30
  2. Encodage d'une url
    Par pacifiquement dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/02/2012, 12h04
  3. Encodage d'une URL
    Par picomz dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 26/11/2006, 20h03
  4. [SQLSERVER] Encodage du corps d'une procédure stockée
    Par marsup54 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/07/2006, 15h36
  5. [String] Encodage de caractères pour une sortie HTML
    Par elitost dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 10/11/2004, 08h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo