1 回答

TA貢獻1856條經驗 獲得超11個贊
歸根結底,這比上面的測試用例還要簡單:
<?php
$html = '<p>ACME’s 27” Monitor is $200.</p>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
echo $dom->saveHtml($dom->documentElement) . PHP_EOL;
echo $dom->saveHtml() . PHP_EOL;
那么問題來了,為什么在保存整個文檔而不僅僅是一個特定的節點時,行為會有所不同?DomDocument::saveHtml
通過查看PHP源代碼,我們會發現它是使用單個節點還是整個文檔進行檢查。對于前者,調用該函數時,編碼顯式設置為 null。對于后者,使用函數,編碼不作為此函數的參數包含在內。htmlNodeDumpFormatOutput
htmlDocDumpMemoryFormat
這兩個函數都來自 libxml2 庫。查看該源,我們可以看到嘗試檢測文檔編碼,并在找不到文檔編碼時將其顯式設置為ASCII / HTML。htmlDocDumpMemoryFormat
這兩個函數最終都調用htmlNodeListDumpOutput
,并為其傳遞已確定的編碼;null ( 不會導致編碼 – 或 ASCII/HTML – 使用 HTML 實體進行編碼。
我的猜測是,對于文檔片段或單個節點,編碼被認為不如完整文檔重要。
- 1 回答
- 0 關注
- 148 瀏覽
添加回答
舉報