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 数据甚至在远程服务器发送之前就丢失了——谷歌似乎正在查看请求标头中的字符串——默认情况下,如果没有流上下文,则不 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 回答