考虑这个例子,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);
?>
Run Code Online (Sandbox Code Playgroud)
如果我用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ÅÄ"
}
Run Code Online (Sandbox Code Playgroud)
显然,原始字符串正确为UTF-8,但textContentDOMDocument的字符串编码不正确.
那么,如何在DOMDocument中将内容作为正确的UTF-8获取?
该DOM扩展是建立在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'));
Run Code Online (Sandbox Code Playgroud)
或者破解指定UTF-8的元标记或xml声明.
$domdoc->loadHTML('<meta http-equiv="Content-Type" content="charset=utf-8" />' . $mystr);
Run Code Online (Sandbox Code Playgroud)
$domdoc->loadHTML('<?xml encoding="UTF-8">' . $mystr);
Run Code Online (Sandbox Code Playgroud)