微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UTF-8与PHP DOMDocument loadHTML?

考虑这个例子,test.PHP

<?PHP
$mystr = "<p>Hello, με काचं  ça øy jeść</p>";
var_dump($mystr);
$domdoc = new DOMDocument('1.0', 'utf-8'); //DOMDocument();
$domdoc->loadHTML($mystr); // already here corrupt UTF-8?
var_dump($domdoc);
?>

如果我用PHP 5.5.9(cli)运行它,我进入终端:

$PHP test.PHP 
string(50) "<p>Hello, με काचं  ça øy jeść</p>"
object(DOMDocument)#1 (34) {
  ["doctype"]=>
  string(22) "(object value omitted)"
...
  ["actualEncoding"]=>
  NULL
  ["encoding"]=>
  NULL
  ["xmlEncoding"]=>
  NULL
...
  ["textContent"]=>
  string(70) "Hello, με à¤à¤¾à¤à¤  ça øy jeÅÄ"
}

显然,原始字符串正确为UTF-8,但DOMDocument的textContent编码不正确.

那么,如何在DOMDocument中将内容作为正确的UTF-8获取

解决方法:

DOM extension构建于libxml2,其HTML解析器是为HTML 4制作的 – 认编码为ISO-8859-1.除非遇到相应的元标记或XML声明,否则loadHTML()将假定内容为ISO-8859-1.

在创建DOMDocument时指定编码不会影响解析器的作用 – 加载HTML(或XML)会替换您为其构造函数提供的xml版本和编码.

解决方法

首先使用mb_convert_encoding()将ASCII范围以上的任何内容转换为其等效的html实体.

$domdoc->loadHTML(mb_convert_encoding($mystr, 'HTML-ENTITIES', 'UTF-8'));

或者破解指定UTF-8的元标记或xml声明.

$domdoc->loadHTML('<Meta http-equiv="Content-Type" content="charset=utf-8" />' . $mystr);
$domdoc->loadHTML('<?xml encoding="UTF-8">' . $mystr);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐