2010-02-10 8 views
47

Je charge un HTML depuis un serveur externe. Le balisage HTML a encodage UTF-8 et contient des caractères tels que l, š, C, T, Z, etc. Lorsque je charge le HTML avec file_get_contents() comme ceci:file_get_contents() rompt les caractères UTF-8

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

Il bousille l'UTF-8 caractères et charges Å, ¾, ¤ et des non-sens similaires au lieu des caractères UTF-8 appropriés.

Comment puis-je résoudre ce problème?

MISE À JOUR:

j'ai essayé à la fois sauver le code HTML dans un fichier et la sortie avec l'encodage UTF-8. Les deux ne fonctionnent pas, cela signifie que file_get_contents() renvoie déjà du code HTML défectueux.

MAJ2:

<!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> 
+0

Les envoyez-vous en utilisant UTF-8? –

+1

Où visualisez-vous le HTML chargé? –

+0

Je ne le publie pas. Je l'enregistre dans un fichier et le lit ensuite. Mais ce n'est pas pertinent parce que j'ai essayé de le sortir avec UTF-8 et il est encore foiré. –

Répondre

6

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

Voir cette question: Why Does DOM Change Encoding?

+0

file_get_contents() est à l'origine du problème. J'avais un fichier JSON que j'ouvrais avec file_get_contents() mais en faisant print_r() après avoir chargé le JSON, les caractères Unicode étaient là mais pas dans le JSON. L'exécution de mb_convert_encoding() sur le fichier file_get_contents() a résolu le problème. – Reado

+0

'$ string = mb_convert_encoding ($ string, 'HTML-ENTITIES', 'UTF-8');' l'a résolu pour moi. – WEBjuju

57

Solution suggested in the comments of the PHP manual entry for 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 essayer votre chance avec http://php.net/manual/en/function.mb-internal-encoding.php

+0

Cette solution est géniale, merci !! – brentonstrine

+1

Ceci devrait être marqué comme meilleure réponse. Merci Gordon. – helpse

4

Je pense que vous avez tout simplement une double conversion du type de caractères là: D

Il 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 conduire à d'autres problèmes.

80

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 puis -

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

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

+7

+1 pour 'HTML-ENTITIES' – Raptor

+0

Génial, cela l'a résolu pour moi. –

+1

Vous avez fait ma journée. – vikingmaster

2

Essayez cela 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); 
1

en langue turque, mb_convert_encoding ou tout autre conversion charset ne fonctionne pas.

Et aussi urlencode n'a pas fonctionné à cause de l'espace char converti en + char. Il doit être% 20 pour le codage en pourcentage.

Celui-ci a fonctionné!

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

    $data = file_get_contents($url); 
0

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 caractères étranges en normal.