3

我正在尝试从yahoo.com获取搜索结果。

但是file_get_contents() 将 UTF-8 字符集(雅虎使用的字符集)内容转换为 ISO-8859-1。

尝试:

$filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref";

echo file_get_contents($filename);

脚本为

header('Content-Type: text/html; charset=UTF-8');

或者

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

或者

$er = mb_convert_encoding($filename , 'UTF-8');

或者

$s2 = iconv("ISO-8859-1","UTF-8",$filename );

或者

echo utf8_encode(file_get_contents($filename));

没有帮助,因为在获取网页内容后,š ť ž 等特殊字符被问号替换???

我将不胜感激任何帮助。

4

4 回答 4

7

这似乎是一个内容协商问题,因为file_get_contents可能发送的请求仅接受 ISO 8859-1 作为字符编码。

您可以创建自定义流上下文file_get_contents使用stream_context_create明确声明您接受 UTF-8 的声明:

$opts = array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0'));
$context = stream_context_create($opts);

$filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref";
echo file_get_contents($filename, false, $context);
于 2011-04-09T11:37:38.520 回答
3

file_get_contents 不应更改字符集。数据作为二进制字符串拉入。

查看您提供的网址时,这是它提供的标题:

Content-Type: text/html; charset=ISO-8859-1

此外,在体内:

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

此外,您无法将 UTF-8 无损转换为 ISO-8859-1 并在返回 UTF-8 时取回字符。UTF-8 / unicode 支持更多的字符,所以字符在第一步中丢失了。

在浏览器中情况并非如此,因此您可能只需要提供一个正确的 Accept-Encoding 标头来指示 yahoo 的系统您可以接受 UTF-8。

于 2011-04-08T20:46:40.790 回答
1
$s2 = iconv("ISO-8859-1","UTF-8//TRANSLIT//IGNORE",$filename );

更好的解决方案...

function curl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_ENCODING, 1);
    return curl_exec($ch);
    curl_close($ch);
}

echo curl($filename);
于 2011-04-08T20:21:44.560 回答
1

对于任何对此进行调查的人:

我花在编码问题上的时间告诉我,很少有 php 函数“神奇地”改变字符串的编码。(这些罕见的例子之一是:

执行($命令,$输出,$returnVal)

另请注意,工作标头集如下:

header('Content-Type: text/html; charset=utf-8');

并不是:

header('Content-Type: text/html; charset=UTF-8');

由于我遇到了与您描述的问题类似的问题,因此正确设置标题就足够了。

希望这可以帮助!

于 2015-06-18T12:21:28.317 回答