file_get_contents() преобразует UTF-8 в ISO-8859-1

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

or

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

or

$er = mb_convert_encoding($filename , 'UTF-8');

or

$s2 = iconv("ISO-8859-1","UTF-8",$filename );

or

echo utf8_encode(file_get_contents($filename));

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

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


person vladinko0    schedule 08.04.2011    source источник
comment
file_get_contents() ничего не конвертирует   -  person Your Common Sense    schedule 09.04.2011


Ответы (4)


Похоже, это проблема согласования контента, поскольку 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);
person Gumbo    schedule 09.04.2011
comment
Забавно, я пробовал Accept-Charset=utf-8;q=0.7,*;q=0.7, но не работает :) - person Dejan Marjanović; 09.04.2011
comment
@webarto: значение utf-8;q=0.7,*;q=0.7 похоже на utf-8,* и одинаково принимает любую кодировку символов. - person Gumbo; 09.04.2011
comment
Хороший Гамбо! Я боролся с умляутами в URL-адресе (Мюнхен) - это решило проблему. Спасибо! - person Craig Morgan; 18.03.2014

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.

person Evert    schedule 08.04.2011
comment
Как вы узнали Content-Type: text/html; charset=ISO-8859-1 и <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> Когда я смотрю исходный код этой страницы, я вижу <!doctype html><html lang="en"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"> - person vladinko0; 09.04.2011
comment
Он использует другую кодировку в зависимости от вашего местоположения, вы можете попробовать получить страницу, используя российские прокси-серверы. - person Dejan Marjanović; 09.04.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);
person Dejan Marjanović    schedule 08.04.2011
comment
Результат: Документ перемещен сюда. - person vladinko0; 09.04.2011
comment
@vladinko0, я думаю, вам нужно установить CURLOPT_FOLLOWLOCATION, я обновил свой ответ, попробуйте еще раз. - person Dejan Marjanović; 09.04.2011
comment
Теперь он загружает страницу, но с тем же результатом, что и с file_get_contents(), то есть с вопросительными знаками. Набор символов также преобразуется в ISO-8859-1. - person vladinko0; 09.04.2011
comment
Кажется, что yahoo.com обслуживает разные страницы (кодировки) в зависимости от вашего IP (страны). Я изменил ваш URL на http://ru.search.yahoo.com, но он не работает. Может быть, вы можете добиться чего-то, приняв заголовки кодировки, отказавшись от ISO-8859-1... - person Dejan Marjanović; 09.04.2011

Для тех, кто расследует это:

The time I spent on encoding issues taught me that rarely php functions "magically" change the encoding of strings. (One of these rare examples is :

exec( $command, $output, $returnVal )

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

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

и не:

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

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

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

person Stavros    schedule 18.06.2015