2

次のようなものを使用してPHP経由でGoogleアラートを読み取ろうとするたびに:

$feed = file_get_contents("http://www.google.com/alerts/feeds/01445174399729103044/950192755411504138");

$feedファイルに保存するか、結果を出力に保存するかに関係なくecho、すべてのutf-8Unicode 文字( つまり 、分音符号のあるもの)は空白で表されます。私は試しました-成功せずに-さまざまな組み合わせ:

  • utf8_encode
  • utf8_decode
  • iconv
  • mb_convert_encoding

間違った文字がストリームから来ていると思いますが、ブラウザーでこのURIを試してみるとすべて問題ないので、わかりません。誰でもこの問題に光を当てることができますか?

4

1 に答える 1

0

申し訳ありませんが、あなたは完全に正しいです -何か不都合なことが起こっています! それはあなたが最初に疑うものではありませんが...参考までに、

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
于 2014-08-06T10:48:29.593 に答える