阅读Google Feed /警报时损坏的UTF-8编码

时间:2014-08-05 20:14:14

标签: php utf-8 character-encoding google-api google-alerts

每当我尝试使用以下内容通过 PHP 阅读Google提醒时

$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 个答案:

答案 0 :(得分:0)

抱歉,您完全正确 - 发生了一些不幸事件!虽然这不是你首先怀疑的......作为参考,鉴于:

echo mb_detect_encoding($feed); // prints: ASCII

unicode数据在被远程服务器发送之前丢失 - 看来Google正在查看请求标头中的user-agent字符串 - 这是不存在的默认情况下file_get_contents没有流上下文。

因为它无法识别发出请求的客户端,所以默认为强制ASCII编码。如果出现某种灾难性的翘起,这可能是必要的后备。 [citation needed ...]

仅仅为您的应用命名并不够,但您需要包含一个已知的供应商。我不确定这个问题的全部内容,但我相信大多数人都会使用“Mozilla [version] 来解决这个问题,例如:

$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