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



每当我尝试通过PHP读取Google alert时,使用如下代码:

$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,那么一切都很好。有人能解释一下这个问题吗?

对不起,你是绝对正确的-有一些不好的事情发生了!虽然这不是你一开始会怀疑的……作为参考,鉴于:

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

unicode数据在远程服务器发送之前丢失了 -似乎Google正在查看请求头中的user-agent字符串-默认情况下使用file_get_contents不存在流上下文。

因为它不能识别发出请求的客户端,所以默认使用并强制使用ASCII编码。这大概是在发生某种灾难性的混乱时必要的退路。<一口>[引文需要…]

仅仅命名你的应用程序是不够的,你需要包括一个已知的供应商。我不确定这个问题的全部范围,但我相信大多数人都包括"Mozilla [version]"来解决这个问题,例如:

$url = 'http://www.google.com/...';
$feed = file_get_contents($url, false, stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => 'Accept-Charset: UTF-8' ."rn"
                   .'User-Agent: (Mozilla/5.0 compatible) MyFeedReader/1.0'
    ]
]));
file_put_contents('test.txt', $feed); // should now work as expected

相关内容

  • 没有找到相关文章

最新更新