Всякий раз, когда я пытаюсь прочитать оповещение Google через PHP, используя что-то вроде:
$feed = file_get_contents("http://www.google.com/alerts/feeds/01445174399729103044/950192755411504138");
Независимо от того, сохраняю ли файл $feed
в файле или echo
результат на выходе, все символы unicode utf-8
( т. Е. С диакритикой) представлены белым пространством. Я пробовал – без успеха – различные комбинации:
utf8_encode
utf8_decode
iconv
mb_convert_encoding
Я думаю, что неправильные символы пришли из потока, но я потерялся, потому что, если я попробую этот URI в браузере, тогда все будет в порядке. Может ли кто-нибудь пролить свет на этот вопрос?
Извините, вы абсолютно правы – происходит что-то неприятное! Хотя это не то, что вы сначала подозреваете … Для справки, учитывая, что:
echo mb_detect_encoding($feed); // prints: ASCII
Данные Юникода теряются до того, как он будет отправлен удаленным сервером – похоже, Google ищет строку user-agent
в заголовке запроса, которая по умолчанию отсутствует в user-agent
file_get_contents
без контекста stream.
Поскольку он не может идентифицировать клиента, делающего запрос по умолчанию, и принудительно кодирует ASCII . Это, по-видимому, необходимый резерв в случае какого-то катаклизма. [нужна цитата…]
Однако недостаточно назвать ваше приложение, но вам нужно включить известного поставщика. Я не уверен в полной мере этого, но я считаю, что большинство людей включают «Mozilla [версия] » для решения этой проблемы, например:
$url = 'http://www.google.com/...'; $feed = file_get_contents($url, false, stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => 'Accept-Charset: UTF-8' ."\r\n" .'User-Agent: (Mozilla/5.0 compatible) MyFeedReader/1.0' ] ])); file_put_contents('test.txt', $feed); // should now work as expected