Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将UTF-8编码指定为PHP';没有元标记的DOMS文档_Php_Domdocument - Fatal编程技术网

将UTF-8编码指定为PHP';没有元标记的DOMS文档

将UTF-8编码指定为PHP';没有元标记的DOMS文档,php,domdocument,Php,Domdocument,下面的HTML代码由脚本标记中的中文单词和代码标记中的一些HTML代码组成 <?php $html = <<<EOD <!DOCTYPE html> <html> <head> <script> const str = "訂閱最新指南"; </script> </head> <body>

下面的HTML代码由
脚本
标记中的中文单词和
代码
标记
中的一些HTML代码组成

<?php

$html = <<<EOD
<!DOCTYPE html>
<html>
    <head>
        <script>
            const str = "訂閱最新指南";
        </script>
    </head>
    <body>
        <pre>
            <code>&lt;img src="cat.jpg"/></code>
        </pre>
        <p>The code for new line is <code>&lt;br/></code> in HTML.</p>
    </body>
</html>
EOD;
新行的代码是HTML中的
br/>

排爆药; 我正在通过PHP的
DOMDocument
解析这段代码。在
saveHTML()
之后,汉字不知何故会转换成一些奇怪的字符。我找到的唯一解决方案是将
添加到
标记中

有没有其他方法可以指定UTF-8编码而不添加此元标记

以下是我所尝试过的(没有一个有效):


如果要无条件覆盖UTF-8编码,可以通过将UTF-8 BOM添加到文件中来实现:

$doc = new DOMDocument();
$doc->loadHTML($html);
if ($doc->encoding === null) {
    $doc->loadHTML('<?xml encoding="utf-8" ?>' . $html);
    $node = $doc->firstChild;
    while (!($node instanceof DOMProcessingInstruction)) {
        $node = $node->nextSibling;
    }
    $node->parentNode->removeChild($node);
}
条件表达式是必需的,因为如果开始时存在双BOM表,库将发出警告

如果您只想将UTF-8作为默认编码而不是拉丁语1,那么没有干净的方法可以做到这一点。不过,您可以使用以下脏黑客:

$meta='<meta content="text/html; charset=utf-8" http-equiv="Content-Type">';
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->encoding = 'UTF-8';
$doc->loadHTML($meta.$html); /* DOMDocument will put the meta at the right place */

echo $doc->saveHTML() . PHP_EOL . PHP_EOL;
$doc=newDOMDocument();
$doc->loadHTML($html);
如果($doc->encoding==null){
$doc->loadHTML(“”.$html);
$node=$doc->firstChild;
而(!($DOMProcessingInstruction的节点实例)){
$node=$node->nextSibling;
}
$node->parentNode->removeChild($node);
}
上面提到的不幸的副作用是,当文件中缺少编码声明时,解析时间实际上增加了一倍。(还请注意,HTML规范查看
处理指令以检测字符编码,这意味着此解决方案依赖于与规范相反的功能。)

要确保在序列化回标记的过程中不会损坏字符,请使用
$doc->saveHTML($doc)
而不是
$doc->saveHTML()
。这将始终导致UTF-8文本,即使文档包含指定不同编码的声明。要以另一种编码方式获取文档,您必须在以后对其进行转换,例如通过执行
mb\u convert\u编码($doc->saveHTML($doc),$doc->xmlcodencing,'utf-8')
(该编码应转换为原始编码,尽管这可能仍然与实际DOM树中的
元素相矛盾)


考虑到使用
DOMDocument
所需的变通方法有很多,我强烈建议切换到另一个解析器。最好也添加到另一种编程语言。

我只需按照您的建议添加meta,因为我不知道是什么阻碍了您的使用,只需知道这对我很有效:

echo str_replace($meta,'',$doc->saveHTML()) . PHP_EOL . PHP_EOL;

要强制输入编码,可以在UTF-8 BOM前面加上前缀:
$doc->loadHTML(“\xEF\xBB\xBF.”$html)@Olivier,但它将汉字编码为其他字符。仍然不是取代utf8 meta的解决方案tag@GijoVarghese它解决了输入编码问题。我没有说它解决了输出编码问题,这是一个不同的问题。@user3840170我正在用它作为WordPress插件。因此,使用另一种语言而不是PHP并不是一个解决方案。您提到的添加meta标记的工作方式与预期的一样。你能告诉我们更多关于哪些代码你有控制权,哪些没有控制权吗?为什么添加meta标签不是一个好的解决方案/为什么您在寻找另一个替代方案?
$meta='<meta content="text/html; charset=utf-8" http-equiv="Content-Type">';
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->encoding = 'UTF-8';
$doc->loadHTML($meta.$html); /* DOMDocument will put the meta at the right place */

echo $doc->saveHTML() . PHP_EOL . PHP_EOL;
echo str_replace($meta,'',$doc->saveHTML()) . PHP_EOL . PHP_EOL;