【问题标题】:Character Encoding issue with PHP Simple HTML DOM ParserPHP Simple HTML DOM Parser 的字符编码问题
【发布时间】:2023-03-21 13:51:01
【问题描述】:

我正在使用 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.compage 的输出

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

amazon.cnpage 的输出

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

mail.rupage 的输出

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

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

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

【问题讨论】:

  • 如果您在浏览器中将“查看”>“编码”下的编码切换为其他内容会怎样?
  • 如果我将浏览器编码切换为 UTF-8,它可以工作。

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


【解决方案1】:

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

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

看完你的cmets,回答当然还有这两篇文章,我终于解决了我的问题。

我已经列出了迄今为止解决此问题的步骤:

  1. 在我的 init.php 文件顶部添加了header('Content-Type: text/html; charset=utf-8');
  2. 更改了将这些值存储为 UTF-8 的数据库表字段的 CHARACTER SET,
  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找到了一个很好的答案

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 上面列出的 PHP 代码只是为了测试如果我添加内容类型标头可以工作。我的真实代码会将信息($meta_title 的值)添加到数据库中,然后另一个页面将从数据库中检索这些值,但在该页面上,即使我设置为 UTF-8,它也无法正常工作。
    • @Prakash:您必须确保将数据库当前连接设置为接受utf-8 数据。在向数据库发送任何查询之前运行此查询SET NAMES UTF-8,并确保您的数据库、表、列设置为 utf-8 编码。然后在您的另一个页面中设置 UTF-8 标头应该可以工作。
    • @Prakash 那么我建议你阅读Handling Unicode Front To Back In A Web App
    【解决方案3】:

    我对罗马尼亚语字符也有同样的问题。在我使用之前没有任何效果

    header('Content-Type: text/html; charset=ISO-8859-2'); 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      相关资源
      最近更新 更多