file_get_contents()将UTF-8转换为ISO-8859-1


file_get_contents() converts UTF-8 to ISO-8859-1

我正在尝试从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));

没有帮助,因为在获得网络内容后,像šťž这样的特殊字符会被问号取代???

如果有任何帮助,我都将不胜感激。

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

您可以使用stream_context_createfile_get_contents创建一个自定义流上下文,该上下文明确声明您接受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);

file_get_contents应该而不是更改字符集。数据以二进制字符串的形式被拉入。

当检查出你提供的url时,这是它提供的标题:

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头来指示雅虎的系统可以接受UTF-8。

$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);

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

我花在编码问题上的时间告诉我,php函数很少"神奇地"改变字符串的编码。(其中一个罕见的例子是:

exec($command,$output,$returnVal(

还请注意,工作标题集如下:

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

而不是:

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

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

希望这能有所帮助!