我正在使用 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
在阅读了您的评论、回答,当然还有那两篇文章之后,我终于解决了我的问题。
我列出了到目前为止我为解决这个问题所做的步骤:
- 在我的 init.php 文件顶部添加了
header('Content-Type: text/html; charset=utf-8');
, - 将存储这些值的数据库表字段的字符集更改为 UTF-8,
- 将 MySQL 连接字符集设置为 UTF-8
mysql_set_charset('utf8', $connection_link_id);
- 使用 htmlentities() 函数转换字符
$meta_title = htmlentities(trim($meta_title_raw), ENT_QUOTES, 'UTF-8');
现在问题似乎已经解决了,但我仍然需要做以下事情才能完全解决这个问题。
- 从源
$source_charset
获取编码的字符集。 - 如果字符串的编码已经不在同一编码中,则将其更改为 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/