在PHP中将UTF-8字符串转换为DOMNode

hlswsv35  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(110)

我已经决定,在我的特定项目中,我想使用PHP提供CSS和HTML。我的CSS和HTML是从各种UTF-8文件中收集的。HTML编码保留在输出中,但CSS编码没有。非ASCII字符被转义为&#nnnnn;。奇怪的是,我可以var_dump没有&#nnnnn;转义的CSS字符串,但我不能附加它作为DOMTextDOMCDATASection没有它转义的文本。我尝试过htmlentities()html_entities_decode()mb_convert_encoding()mb_detect_encoding()utf8_encode()utf8_decode()createTextNode()createCDATASection()的各种组合,但无法完成这个简单的任务。我不关心输出是如何编码的(尽管UTF-8是最好的),只要CSS中的字符显示为字符即可。
我的原始代码是这样的:

<?php
    $document = new DOMDocument();
    $document->loadHTMLFile("text.html");
    $document->formatOutput = true;
    $xPath = new DOMXpath($document);
    $head = $xPath->query("//html/head")[0];
    $styleElement = $document->createElement("style");
    $styleElement->setAttribute("type", "text/css");
    $styles = $document->createTextNode(file_get_contents("style.css"));
    $styleElement->appendChild($styles);
    $head->appendChild($styleElement);
    echo $document->saveHTML();
?>

超文本标记语言:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <p>Put a ✧ before this.</p>
    </body>
</html>

CSS:

@charset "utf-8";

p::before {
    content: '✧';
}

输出量:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">&#65279;p::before {
                content: '&#10023;';
            }
        </style>
    </head>
    <body>
        <p>Put a ✧ before this.</p>
    </body>
</html>

(当浏览器呈现:Put a ✧ before this.
所需输出:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">
            p::before {
                content: '✧';
            }
        </style>
    </head>
    <body>
        <p>Put a ✧ before this.</p>
    </body>
</html>

(当浏览器呈现:✧Put a ✧ before this.
(我知道有更简单的方法可以用echo s等来完成上面的例子,但是在更广泛的背景下,使用DOM和DOM是有意义的。

4dbbbstv

4dbbbstv1#

确保在编辑器中选中“Include Unicode(BOM)signature”复选框

相关问题