file_get_contents无法使用utf8

时间:2011-02-07 02:44:43

标签: php utf-8 character file-get-contents

我正试图从网站上获取泰国字符。我试过了:

$rawChapter = file_get_contents("URL");
$rawChapter = mb_convert_encoding($rawChapter, 'UTF-8', mb_detect_encoding($rawChapter, 'UTF-8, ISO-8859-1', true));

当我这样做时,角色会回来:

¡ÅѺ˹éÒáá¾ÃФÑÁÀÕÃìÀÒÉÒä·A©ºÑº

但是,如果我将页面的源代码加载并将其保存到我的localhost上的自己的.htm文件中作为utf8文件,那么它会正确加载泰语字符。只有当我尝试直接从网站加载它时才会中断。

我该如何解决这个问题?可能是什么问题?

我也试过添加这个上下文:

$context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'header' => implode("\r\n", array(
                    'Content-type: application/x-www-form-urlencoded',
                    'Accept-Language: en-us,en;q=0.5',
                    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'
                ))
            )
        ));

我尝试过单独添加它,我尝试使用mb_convert_encoding()添加它...我觉得我已经尝试过这些东西的所有组合而没有成功。

1 个答案:

答案 0 :(得分:2)

Accept-Charset更改为UTF-8,因为ISO-8859-1不支持泰语字符。如果您在Windows机器上运行PHP脚本,您也可以使用windows-874字符集,也可以尝试添加此标题:

Content-Language: th

但在大多数情况下,UTF-8将处理几乎大多数字符或字符集,而无需任何其他声明。

** 更新 **

很奇怪,但这对我有用。

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=> implode("\r\n", array(
                   'Content-type: text/plain; charset=TIS-620'
                   //'Content-type: text/plain; charset=windows-874'  // same thing
                ))
  )
);

$context = stream_context_create($opts);

//$fp = fopen('http://thaipope.org/webbible/01_002.htm', 'rb', false, $context);
//$contents = stream_get_contents($fp);
//fclose($fp);
$contents = file_get_contents("http://thaipope.org/webbible/01_002.htm",false, $context);

header('Content-type: text/html; charset=TIS-620');
//header('Content-type: text/html; charset=windows-874');  // same thing

echo $contents;

显然,我对这个关于UTF-8的错误。有关详细信息,请参阅here。虽然你仍然可以输出UTF-8:

$in_charset = 'TIS-620';   // == 'windows-874'
$out_charset = 'utf-8';

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=> implode("\r\n", array(
                   'Content-type: text/plain; charset=' . $in_charset
                ))
  )
);

$context = stream_context_create($opts);

$contents = file_get_contents("http://thaipope.org/webbible/01_002.htm",false, $context);
if ($in_charset != $out_charset) {
    $contents = iconv($in_charset, $out_charset, $contents);
}

header('Content-type: text/html; charset=' . $out_charset);

echo $contents;   // output in UTF-8