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 關注
- 307 瀏覽
添加回答
舉報