web-dev-qa-db-fra.com

file_get_contents () rompt les caractères UTF-8

Je charge un fichier HTML depuis un serveur externe. Le balisage HTML a un codage UTF-8 et contient des caractères tels que, š, č, ť, ž, etc. Quand je charge le code HTML avec file_get_contents () comme ceci:

$html = file_get_contents('http://example.com/foreign.html');

Il bousille les caractères UTF-8 et charge Å, ¾, ¤ et un non-sens similaire au lieu des caractères UTF-8 appropriés.

Comment puis-je résoudre ça?

METTRE À JOUR:

J'ai essayé à la fois de sauvegarder le code HTML dans un fichier et de le générer avec le codage UTF-8. Les deux ne fonctionnent pas, cela signifie donc que file_get_contents () renvoie déjà du code HTML cassé.

UPDATE2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sk" lang="sk">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Language" content="sk" />
<title>Test</title>

</head>
<body>


<?php

$html = file_get_contents('http://example.com');
echo htmlentities($html);

?>

</body>
</html>
55
Richard Knop

Bien. J'ai découvert que la file_get_contents () ne cause pas ce problème. Il y a une autre raison dont je parle dans une autre question. Que je suis bête.

Voir cette question: Pourquoi DOM change-t-il le codage?

6
Richard Knop

J'ai eu le même problème avec la langue polonaise 

J'ai essayé:

$fileEndEnd = mb_convert_encoding($fileEndEnd, 'UTF-8', mb_detect_encoding($fileEndEnd, 'UTF-8', true));

J'ai essayé:

$fileEndEnd = utf8_encode ( $fileEndEnd );

J'ai essayé:

$fileEndEnd = iconv( "UTF-8", "UTF-8", $fileEndEnd );

Et alors -

$fileEndEnd = mb_convert_encoding($fileEndEnd, 'HTML-ENTITIES', "UTF-8");

Ce dernier a parfaitement fonctionné !!!!!!

95
ugniesdebesys

Solution suggérée dans les commentaires de l'entrée de manuel PHP pour file_get_contents

function file_get_contents_utf8($fn) {
     $content = file_get_contents($fn);
      return mb_convert_encoding($content, 'UTF-8',
          mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}

Vous pouvez également tenter votre chance avec http://php.net/manual/en/function.mb-internal-encoding.php

66
Gordon

Je pense que vous avez simplement une double conversion du type de caractère: D 

C'est peut-être parce que vous avez ouvert un document HTML dans un document HTML. Donc, vous avez quelque chose qui ressemble à ceci à la fin

<!DOCTYPE html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>
<body>
<!DOCTYPE html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>.......

L'utilisation de mb_detect_encoding peut donc vous mener à d'autres problèmes.

5
Dr. Dama

Essayez ceci aussi

 $url = 'http://www.domain.com/';
    $html = file_get_contents($url);

    //Change encoding to UTF-8 from ISO-8859-1
    $html = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $html);
2
Mohamm6d

En turc, mb_convert_encoding ou toute autre conversion de jeu de caractères ne fonctionnait pas.

De plus, urlencode ne fonctionnait pas à cause de la conversion de caractère dans + char. Il doit être% 20 pour l’encodage en pourcentage.

Celui-ci a fonctionné!

   $url = rawurlencode($url);
   $url = str_replace("%3A", ":", $url);
   $url = str_replace("%2F", "/", $url);

   $data = file_get_contents($url);
2
Mustafa Ergüven

Je travaille avec 35000 lignes de données.

$f=fopen("veri1.txt","r");
$i=0;
while(!feof($f)){
    $i++;
    $line=mb_convert_encoding(fgets($f), 'HTML-ENTITIES', "UTF-8");
    echo $line;
}

Ce code convertit mes étranges caractères en normal.

0
matasoy