Я пытаюсь получить результаты поиска с yahoo.com .
Но file_get_contents () конвертирует кодировку UTF-8 (кодировка, которая использует yahoo) в ISO-8859-1.
Пытаться:
$filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref"; echo file_get_contents($filename);
Скрипты как
header('Content-Type: text/html; charset=UTF-8');
или
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
или
$er = mb_convert_encoding($filename , 'UTF-8');
или
$s2 = iconv("ISO-8859-1","UTF-8",$filename );
или
echo utf8_encode(file_get_contents($filename));
НЕ помогите, потому что после получения веб-контента специальные символы как š ť ž заменяются вопросительными знаками ???
Я был бы признателен за любую помощь.
Это, кажется, проблема согласования контента, поскольку file_get_contents
вероятно, отправляет запрос, который принимает только ISO 8859-1 в качестве кодировки символов.
Вы можете создать настраиваемый контекст потока для file_get_contents
используя stream_context_create
который явно заявляет, что вы принимаете UTF-8:
$opts = array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0')); $context = stream_context_create($opts); $filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref"; echo file_get_contents($filename, false, $context);
file_get_contents не должны изменять кодировку. Данные втягиваются как двоичная строка.
При проверке URL, который вы указали, это заголовок, который он предоставляет:
Content-Type: text/html; charset=ISO-8859-1
Кроме того, в теле:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
Кроме того, вы не можете конвертировать UTF-8 без потерь в ISO-8859-1 и вернуть символы обратно в UTF-8. UTF-8 / unicode поддерживает гораздо больше символов, поэтому символы теряются на первом этапе.
В браузере это не так, поэтому, возможно, вам просто нужно предоставить правильный заголовок Accept-Encoding, чтобы проинструктировать систему yahoo, вы можете принять UTF-8.
Для тех, кто расследует это:
Время, которое я потратил на проблемы с кодированием, научило меня, что редко функции php «волшебным образом» меняют кодировку строк. (Один из таких редких примеров:
exec ($ command, $ output, $ returnVal)
Также обратите внимание, что рабочий набор заголовков выглядит следующим образом:
header ('Content-Type: text / html; charset = utf-8');
и не:
header ('Content-Type: text / html; charset = UTF-8');
Поскольку у меня была такая же проблема, как и описанная вами, достаточно было правильно настроить заголовки.
Надеюсь это поможет!
$s2 = iconv("ISO-8859-1","UTF-8//TRANSLIT//IGNORE",$filename );
Лучшее решение …
function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_ENCODING, 1); return curl_exec($ch); curl_close($ch); } echo curl($filename);