DOMDocument 無法處理UTF-8 字元
在Web 伺服器使用UTF-8 編碼傳輸回應的情況下,所有檔案同樣以UTF -8 儲存,並且所有相關設定都已配置為UTF-8 編碼,則會出現問題。旨在驗證輸出功能的測試程序表現出不規則行為。
執行程序後,輸出呈現如下:
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>Test!</title></head><body> <h1>☆ Hello ☆ World ☆</h1> </body></html>
,呈現為:
< ;h1>☆ 你好↑ 世界↑
節目:
<code class="php">$html = <<<HTML <!doctype html> <html> <head> <meta charset="utf-8"> <title>Test!</title> </head> <body> <h1>☆ Hello ☆ World ☆</h1> </body> </html> HTML; $dom = new DOMDocument("1.0", "utf-8"); $dom->loadHTML($html); header("Content-Type: text/html; charset=utf-8"); echo($dom->saveHTML());</code>
根本原因是DOMDocument::loadHTML() 預期HTML 格式的字串。 HTML 本質上使用 ISO-8859-1(ISO 拉丁字母 1)作為其預設字元編碼。因此,當為 HTML 4.0 設計的 HTML 解析器遇到超過此編碼的字元時,它可能會表現出不可預測的行為。
將非ASCII 字元轉換為實體
要修正此問題,所有ASCII 範圍(127 / h7F) 以外的字元都應轉換為HTML 實體。此過程可以使用mb_convert_encoding 和HTML-ENTITIES 目標編碼來實現:
<code class="php">$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");</code>
新增內容類型元標記
或者,可以透過以下方式解決該問題合併一個標記到文件本身,將字元集指定為UTF-8:
<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
此方法充當DOMDocument 的提示,強制其將輸入解釋為UTF-8 編碼。即使位於
之外,部分,HTML 2.0 規範規定此類元素將在標頭內自動重新定位。以上是為什麼 DOMDocument 在載入 HTML 時無法正確處理 UTF-8 字元?的詳細內容。更多資訊請關注PHP中文網其他相關文章!