file_get_contents () преобразует UTF-8 в ISO-8859-1 - PullRequest
3 голосов
/ 09 апреля 2011

Я пытаюсь получить результаты поиска от 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));

НЕ помогает, потому что после получения веб-контента специальные символы, такие как š ť ž, заменяются знаками вопроса ???

Буду признателен за любую помощь.

Ответы [ 4 ]

7 голосов
/ 09 апреля 2011

Кажется, это проблема согласования содержимого , поскольку 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);
3 голосов
/ 09 апреля 2011

file_get_contents должен не изменить кодировку. Данные извлекаются в виде двоичной строки.

При проверке предоставленной вами ссылки, это заголовок, который она предоставляет:

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.

1 голос
/ 18 июня 2015

Для тех, кто занимается этим:

Время, которое я потратил на вопросы кодирования, научило меня, что редко php-функции «волшебным образом» изменяют кодировку строк. (Один из этих редких примеров:

exec( $command, $output, $returnVal )

Обратите внимание, что рабочий набор заголовков выглядит следующим образом:

header('Content-Type: text/html; charset=utf-8');

а не:

header('Content-Type: text/html; charset=UTF-8');

Поскольку у меня была проблема, аналогичная той, которую вы описываете, этого было достаточно, чтобы правильно установить заголовки.

Надеюсь, это поможет!

1 голос
/ 09 апреля 2011
$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);
...