Повреждена кодировка 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
Другие вопросы по тегам