2010-02-10 3 views
47

Я загружаю HTML с внешнего сервера. HTML-разметка имеет UTF-8 кодирование и содержит символы, такие как L, S, C, T, Z и т.д. Когда я загрузить HTML с file_get_contents(), как это:file_get_contents() Разрывает символы UTF-8

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

Это портит UTF-8 символов и нагрузок Å, ¾, ¤ и подобных глупостей вместо правильных символов UTF-8.

Как я могу это решить?

UPDATE:

Я пытался как сохранение HTML в файл и вывод его с UTF-8 кодировке. Оба не работают, поэтому означает, что file_get_contents() уже возвращает неработающий 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

Вывод их с помощью UTF-8? –

+1

Где вы просматриваете загруженный HTML? –

+0

Я не выводю его. Я сохраняю его в файле, а затем читаю. Но это не имеет значения, потому что я попытался выдать его с UTF-8, и он все еще испорчен. –

ответ

6

Alright. Я обнаружил, что file_get_contents() не вызывает этой проблемы. Есть другая причина, о которой я говорю в другом вопросе. Дурак я.

Смотрите этот вопрос: Why Does DOM Change Encoding?

+0

file_get_contents() вызывает проблему. У меня был файл JSON, который я открывал с помощью file_get_contents(), но после выполнения print_r() после загрузки JSON символы Юникода были там, но не в JSON. Выполнение mb_convert_encoding() в файле_get_contents() устраняет проблему. – Reado

+0

'$ string = mb_convert_encoding ($ string, 'HTML-ENTITIES'," UTF-8 ");' решил это для меня. – 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)); 
} 

Вы можете также попробовать свою удачу с http://php.net/manual/en/function.mb-internal-encoding.php

+0

Это решение отлично, спасибо! – brentonstrine

+1

Это должно быть отмечено как лучший ответ. Спасибо, Гордон. – helpse

4

Я думаю, что вы просто имеют двойное преобразование символьного типа там: D

Это может быть, потому что вы открыли документ HTML в документ HTML. Так что у вас есть то, что выглядит, как это в конце концов

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

Использование mb_detect_encoding поэтому может привести вас к другим вопросам.

80

У меня была аналогичная проблема с польского языка

Я попытался:

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

Я попробовал:

$fileEndEnd = utf8_encode ($fileEndEnd); 

Я попробовал:

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

А потом -

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

Это последнее сработало отлично !!!!!!

+7

+1 для 'HTML-ENTITIES' – Raptor

+0

Удивительно, это решило это для меня. –

+1

Ты сделал мой день. – vikingmaster

2

Попробуйте это тоже

$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

на турецком языке, mb_convert_encoding или любое другое преобразование кодировок не работает.

А также urlencode не работает из-за пробела, преобразованного в + char. Он должен составлять% 20 ​​для кодирования процентов.

Это работало!

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

    $data = file_get_contents($url); 
0

Я работаю с 35000 строками данных.

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

Этот код превращает мои странные персонажи в норму.

Смежные вопросы