在 PHP 中将 UTF-8 字符串附加到 DOMNode

Appending UTF-8 strings to DOMNode in PHP

提问人:Christopher Kellett 提问时间:10/2/2023 最后编辑:Christopher Kellett 更新时间:10/9/2023 访问量:39

问:

我已经决定在我的特定项目中,我想使用 PHP 将 CSS 与 HTML 一起交付。我的 CSS 和 HTML 是从各种 UTF-8 文件中收集的。HTML 编码保留在输出中,但 CSS 编码不保留。我正在将非 ASCII 字符转义为 .奇怪的是,我可以在没有转义的情况下使用CSS字符串,但我不能将其附加为或不将其转义文本。我尝试了 、 、 、 、我不在乎输出是如何编码的(尽管 UTF-8 是最好的),只要 CSS 中的字符显示为字符即可。&#nnnnn;var_dump&#nnnnn;DOMTextDOMCDATASectionhtmlentities()html_entities_decode()mb_convert_encoding()mb_detect_encoding()utf8_encode()utf8_decode()createTextNode()createCDATASection()

我的原始代码是这样的:

<?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();
?>

HTML格式:

<!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.)

(我知道有更简单的方法可以用 s 等完成上述示例,但使用 DOM 和 XPath 在更广泛的上下文中是有意义的。echo

php css utf-8 html 实体

评论

0赞 Daniel W. 10/2/2023
你能试试代替吗?createCDATASectioncreateTextNode
0赞 Christopher Kellett 10/3/2023
我昨天试过了,但奇怪的是它没有区别......createCDATASection
0赞 CBroe 10/4/2023
您是否已经尝试过在 DOMDocument 构造函数中传递编码?
0赞 Christopher Kellett 10/4/2023
刚刚尝试过。没有变化。现在也尝试添加到CSS。没有运气。@charset "utf-8";
0赞 Christopher Kellett 10/4/2023
进一步尝试将 CDATA 标记添加到 - HTML 实体(在 CSS 中不可读)仍然出现,只是现在根本没有解析任何 CSS。我一直在阅读CSS编码。我可以使用CSS字符代码格式,但是通过PHP中的转换来实现,可以吗?旁白 - 为什么 CSS 不使用 HTML 转义?CDATASection

答:

0赞 neopheus 10/2/2023 #1

确保选中编辑器中的“包含 Unicode (BOM) 签名”框

评论

0赞 Christopher Kellett 10/3/2023
好的,我添加了 BOM 签名,但输出没有变化......