2010-02-10 12 views
47

Załaduję kod HTML z zewnętrznego serwera. Znaczniki HTML ma kodowanie UTF-8 i zawiera znaki, takie jak L, S, C, T, Z itp Kiedy załadować HTML z file_get_contents(), tak jak to:file_get_contents() Rozbija znaki UTF-8

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

To bałagan UTF-8 znaki i ładunki Å, ¾, ¤ i podobne bzdury zamiast właściwych znaków UTF-8.

Jak mogę to rozwiązać?

UPDATE:

Próbowałem zarówno zapisywania do pliku HTML i wyprowadzania go z kodowaniem UTF-8. Oba nie działają, więc oznacza to, że file_get_contents() zwraca już uszkodzony kod HTML.

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

Czy wyprowadzasz je za pomocą UTF-8? –

+1

Gdzie oglądasz załadowany HTML? –

+0

Nie wysyłam go. Zapiszę go do pliku, a następnie go odczytam. Ale jest to nieistotne, ponieważ próbowałem wyprowadzić go z UTF-8 i nadal jest pomieszane. –

Odpowiedz

6

porządku. Dowiedziałem się, że plik file_get_contents() nie powoduje tego problemu. Jest inny powód, o którym mówię w innym pytaniu. Głupi ja.

Zobacz na to pytanie: Why Does DOM Change Encoding?

+0

file_get_contents() powoduje problem. Miałem plik JSON, który otwierałem z file_get_contents(), ale po zrobieniu print_r() po załadowaniu JSON-a istniały znaki unicode, ale nie w JSON. Wykonanie mb_convert_encoding() na file_get_contents() rozwiązało problem. – Reado

+0

'$ string = mb_convert_encoding ($ string, 'HTML-ENTITIES'," UTF-8 ");' rozwiązało to dla mnie. – 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)); 
} 

Można także spróbować szczęścia z http://php.net/manual/en/function.mb-internal-encoding.php

+0

To rozwiązanie jest wspaniałe, dzięki! – brentonstrine

+1

To powinno być oznaczone jako najlepsza odpowiedź. Dzięki Gordon. – helpse

4

myślę, że po prostu mają podwójną konwersję typu znaków tam: D

Może to być, ponieważ po otwarciu dokumentu HTML w dokumencie html. Więc trzeba coś, co wygląda jak ten w końcu

<!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>....... 

Zastosowanie mb_detect_encoding dlatego może prowadzić do innych problemów.

80

miałem podobny problem z językiem polskim

ja próbowałem:

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

Próbowałem:

$fileEndEnd = utf8_encode ($fileEndEnd); 

Próbowałem:

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

a następnie -

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

Ten ostatni działał idealnie !!!!!!

+7

+1 dla 'HTML-ENTITIES' – Raptor

+0

Awesome, to rozwiązało to dla mnie. –

+1

Zrobiłeś mój dzień. – vikingmaster

2

Spróbuj zbyt

$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

w języku tureckim, mb_convert_encoding lub inny konwersji charset nie działa.

A także kod URL nie działał, ponieważ znak spacji został przekonwertowany na znak +. Musi być% 20 dla kodowania procentowego.

Ten zadziałał!

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

    $data = file_get_contents($url); 
0

Pracuję z 35000 linii danych.

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

Ten kod konwertuje moje dziwne znaki na normalne.