每当我尝试通过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