2 回答
TA贡献1829条经验 获得超9个赞
DOMDocument::loadXML()从 XML 声明中读取编码属性。但Unicode不是一个有效的编码afaik - 我期望UTF-16LE。PHP 中的 DOM API 使用 UTF-8。因此它会将任何内容解码为 UTF-8(取决于定义的编码)并根据目标文档的编码对其进行编码。您可以在加载后更改它。
这是一个演示:
$xml = <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<foo>ÄÖÜ</foo>
XML;
$document = new DOMDocument();
$document->loadXML($xml);
$encodings = ['ASCII', 'UTF-16', 'UTF-16LE', 'UTF-16BE'];
foreach ($encodings as $encoding) {
// set required encoding
$document->encoding = $encoding;
// save
echo $encoding."\n".$document->saveXML()."\n";
}
输出:
ASCII
<?xml version="1.0" encoding="ASCII"?>
<foo>ÄÖÜ</foo>
UTF-16
��<?xml version="1.0" encoding="UTF-16"?>
<foo>���</foo>
UTF-16LE
<?xml version="1.0" encoding="UTF-16LE"?>
<foo>���</foo>
UTF-16BE
<?xml version="1.0" encoding="UTF-16BE"?>
<foo>���</foo>
生成的字符串随定义的编码而变化。
我从这里开始使用 UTF-8 文档 - 因为 SO 本身就是 UTF-8,您可以通过这种方式看到非 ascii 字符。ASCII触发非 ascii 字符的实体编码。UTF-16添加 BOM 以提供字节顺序。SO 无法显示 UTF-16 编码的字符 - 所以你会得到 符号。UTF-16LE并UTF-16BE在编码中定义字节顺序,不需要BOM。
当然,反过来也是一样的。
TA贡献1797条经验 获得超4个赞
这是一个通用 XSLT,它将按原样复制您的整个输入 XML,但使用 xsl:output 中指定的编码。剩下的就是在 PHP 中运行 XSLT 转换。
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
- 2 回答
- 0 关注
- 284 浏览
添加回答
举报