PHP简单HTML DOM解析器的字符编码问题

时间:2012-09-10 12:30:09

标签: php mysql dom curl simple-html-dom

我使用PHP Simple HTML DOM Parser http://simplehtmldom.sourceforge.net/从其他域获取页面标题,元描述和元标记等数据,然后将其插入数据库。

但我有一些编码问题。问题是我从那些不是英语的网站上得不到正确的字符。

以下是代码:

<?php
require 'init.php';

$curl = new curl();
$html = new simple_html_dom();

$page = $_GET['page'];

$curl_output = $curl->getPage($page);

$html->load($curl_output['content']);
$meta_title = $html->find('title', 0)->innertext;

print $meta_title . "<hr />";

// print $html->plaintext . "<hr />";
?>

facebook.com

的输出

Welcome to Facebook — Log in, sign up or learn more

amazon.cn

的输出

亚马逊-网上购物商城:è¦ç½‘è´­, å°±æ¥Z.cn!

mail.ru

的输出

Mail.Ru: почта, поиÑк в интернете, новоÑти, игры, развлечениÑ

因此,字符编码不正确。

任何人都可以帮我解决这个问题,以便我可以将正确的数据添加到我的数据库中。

3 个答案:

答案 0 :(得分:9)

@deceze和@Shakti感谢您的帮助。

对于deceze(Handling Unicode Front to Back in a Web App)发布的文章链接,

+1,还值得一读Understanding encoding

在阅读你的评论,回答当然这两篇文章之后,我终于解决了我的问题。

我列出了目前为止解决此问题的步骤:

  1. 在我的init.php文件顶部添加了header('Content-Type: text/html; charset=utf-8');
  2. 更改了我的数据库表字段的CHARACTER SET,该字段将这些值存储为UTF-8,
  3. 将MySQL连接字符集设置为UTF-8 mysql_set_charset('utf8', $connection_link_id);
  4. 使用htmlentities()函数转换字符$meta_title = htmlentities(trim($meta_title_raw), ENT_QUOTES, 'UTF-8');
  5. 现在这个问题似乎已经解决了,但我仍然需要做以下事情来解决这个问题。

    1. 从源$source_charset获取已编码的字符集。
    2. 如果字符串的编码已经不是相同的编码,则将其编码更改为UTF-8。为此,唯一可用的PHP函数是iconv()。示例:iconv($source_charset, "UTF-8", $meta_title_raw);
    3. 获取$source_charset我可能需要使用一些技巧或多重检查。就像检查标题和元标记等一样。我在Detect encoding

      找到了一个很好的答案

      如果我的步骤有任何改进或任何错误,请告诉我。

答案 1 :(得分:2)

  

如果我将浏览器编码切换为UTF-8,则可以正常工作。

因此,您只是没有设置正确的HTTP标头来指定您的文档是UTF-8编码的,而浏览器正在以其他编码方式解释它。使用:

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

答案 2 :(得分:0)

我对罗马尼亚字符有同样的问题。在我使用

之前没有任何效果
header('Content-Type: text/html; charset=ISO-8859-2'); 

ISO-8859-2是东欧字母的字符集。因此,请为您的语言找到正确的字符集,并在标题中使用它。