Повреждена кодировка UTF-8 при чтении фида / оповещений Google.
Всякий раз, когда я пытаюсь прочитать предупреждение Google через PHP, используя что-то вроде:
$feed = file_get_contents("http://www.google.com/alerts/feeds/01445174399729103044/950192755411504138");
Независимо от того, спасу ли я $feed
в файл или echo
результат на выходе, все utf-8
символы Unicode ( т.е. с диакритическими знаками) представлены пробелами. Я пробовал - безуспешно - различные комбинации:
utf8_encode
utf8_decode
iconv
mb_convert_encoding
Я думаю, что из потока пришли неправильные символы, но я заблудился, потому что, если я попробую этот URI в браузере, тогда все в порядке. Кто-нибудь может пролить свет на эту проблему?
1 ответ
Извините, вы абсолютно правы - происходит что-то неприятное! Хотя это не то, что вы сначала подозреваете... Для справки, учитывая, что:
echo mb_detect_encoding($feed); // prints: ASCII
Данные Unicode будут потеряны до того, как они будут отправлены удаленным сервером - кажется, что Google смотрит на user-agent
строка в заголовке запроса - которая не существует, используя file_get_contents
по умолчанию без потокового контекста.
Поскольку он не может идентифицировать клиента, выполняющего запрос, он по умолчанию использует кодировку 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