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

标签 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页面的输出

欢迎使用 Facebook €”登录、注册或了解更多信息

amazon.cn页面的输出

亚马逊-网上è´ç‰©å•†åŸŽï¼šè¦ç½‘è´, å°±æ¥Z.cn!

mail.ru页面的输出

Mail.Ru: почта, п °Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ

所以,字符没有被正确编码。

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

最佳答案

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

+1 为 deceze ( Handling Unicode Front to Back in a Web App ) 发布的文章链接,它也值得一读 Understanding encoding

在阅读了您的评论、回答,当然还有那两篇文章之后,我终于解决了我的问题。

我列出了到目前为止我为解决这个问题所做的步骤:

  1. 在我的 init.php 文件顶部添加了 header('Content-Type: text/html; charset=utf-8');
  2. 将存储这些值的数据库表字段的字符集更改为 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');

现在问题似乎已经解决了,但我仍然需要做以下事情才能完全解决这个问题。

  1. 从源 $source_charset 获取编码的字符集。
  2. 如果字符串的编码已经不在同一编码中,则将其更改为 UTF-8。为此,唯一可用的 PHP 函数是 iconv()。示例:iconv($source_charset, "UTF-8", $meta_title_raw);

为了获得 $source_charset 我可能不得不使用一些技巧或多重检查。比如检查标题和元标记等。我在 Detect encoding 找到了一个很好的答案。

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

关于php - PHP 简单 HTML DOM 解析器的字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12351776/

相关文章:

php - 报告链接帮助

php - CKeditor 和 TinyMCE 在发布的内容上输出 HTML 标签

php - 使用谷歌地图作为背景?

php - .htaccess 404 真实路径错误

php - Laravel 中使用 phpunit 拒绝访问数据库

javascript - knockout.js 并修复了元素上的左滚动绑定(bind)

mysql - Rails 和 PostgreSQL 支持有多好?

php - 合并数据并减少表中的行数?

javascript - 在加载另一个javascript的javascript中添加javascript

javascript - 包含特定类的 div 的 jquery 选择器