1 回答

TA貢獻1856條經(jīng)驗 獲得超11個贊
歸根結(jié)底,這比上面的測試用例還要簡單:
<?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;
那么問題來了,為什么在保存整個文檔而不僅僅是一個特定的節(jié)點時,行為會有所不同?DomDocument::saveHtml
通過查看PHP源代碼,我們會發(fā)現(xiàn)它是使用單個節(jié)點還是整個文檔進行檢查。對于前者,調(diào)用該函數(shù)時,編碼顯式設(shè)置為 null。對于后者,使用函數(shù),編碼不作為此函數(shù)的參數(shù)包含在內(nèi)。htmlNodeDumpFormatOutput
htmlDocDumpMemoryFormat
這兩個函數(shù)都來自 libxml2 庫。查看該源,我們可以看到嘗試檢測文檔編碼,并在找不到文檔編碼時將其顯式設(shè)置為ASCII / HTML。htmlDocDumpMemoryFormat
這兩個函數(shù)最終都調(diào)用htmlNodeListDumpOutput
,并為其傳遞已確定的編碼;null ( 不會導致編碼 – 或 ASCII/HTML – 使用 HTML 實體進行編碼。
我的猜測是,對于文檔片段或單個節(jié)點,編碼被認為不如完整文檔重要。
- 1 回答
- 0 關(guān)注
- 134 瀏覽
添加回答
舉報