字符编码和file_get_contents

时间:2013-11-30 14:19:17

标签: php html utf-8 echo

我正在学习PHP编程,我正在测试一些东西。

我一直在尝试下载一些HTML数据:

$this->html = file_get_contents($this->url);

$fh = fopen('txt\htm.txt', 'w') or die("can't open file");
        fwrite($fh, $this->html);
        fclose($fh);

一旦我运行此脚本,它就会从页面下载HTML并将其保存在文本文件中;到这里一切正常。

在HTML文件中,有一些我想要提取并保存在内存中的数据。

示例:

  • “汽车”
  • “香蕉”
  • “tâllian”< -
  • “狗”

我使用的代码:(我正在使用XPath)

$doc = new DOMDocument;
@$doc->loadHTML($this->html);
$xpath = new DOMXpath($doc);

    $this->string1 = $this->GetName('//div/div[2]/table/tbody/tr[1]/td[1]/a/span',$xpath);
        $this->string2 = $this->GetName('//div/div[2]/table/tbody/tr[2]/td[1]/a/span',$xpath);
        $this->string3 = $this->GetName('//div/div[2]/table/tbody/tr[3]/td[1]/a/span',$xpath);  
        $this->string4 = $this->GetName('//div/div[2]/table/tbody/tr[4]/td[1]/a/span',$xpath);


    private function GetName($xquery,$xpath)
    {
        $result_rows = $xpath->query($xquery);
        foreach ($result_rows  as $result_object)
        {
            return substr($result_object->nodeValue, strpos($result_object->nodeValue, '>')+1,strlen($result_object->nodeValue) );
        }

}

如果我打印:

echo 'tâllian<br>';
echo $this->string1.'<br>';
echo $this->string2.'<br>';
echo $this->string3.'<br>'; //tâllian
echo $this->string4.'<br>';

结果:

  • tâllian&lt; -
  • 香蕉
  • tâllian&lt; -

所以我的问题是,为什么脚本会返回“t?llian”而不是“tâllian”?

我希望这些问题是由我的函数GetName引起的......你怎么看?

有趣的事实

  • 当我在我的文本文件(“txt \ htm.txt”)中搜索单词“tâllian”时,我发现它干净清晰。
  • 当我执行echo 'tâllian';时,它会将其清除并清除,因为我有这个标题:header('Content-Type: text/html; charset=utf-8');

找到解决方案:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
$doc = new DOMDocument;
@$doc->loadHTML($html);

在创建新的DOMDocument之前需要进行转换。

2 个答案:

答案 0 :(得分:0)

如果您使用htmlentities();方法会怎样?尝试使用以下代码:

echo htmlentities($this->string3) . "<br />";

这可能是因为当您将它们打印为纯文本时,这些特殊字符(在这一个中,带屋顶的A)无法正确打印。您应该将它们打印为HTML实体。下面使用的方法会自动执行此操作。

您可以在PHP页面中找到有关此方法的更多信息:htmlentities

答案 1 :(得分:0)

找到解决方案:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
$doc = new DOMDocument;
@$doc->loadHTML($html);

在创建新的DOMDocument之前需要进行转换。