首頁  >  文章  >  後端開發  >  為什麼 DOMDocument 在載入 HTML 時無法正確處理 UTF-8 字元?

為什麼 DOMDocument 在載入 HTML 時無法正確處理 UTF-8 字元?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 10:12:30337瀏覽

Why does DOMDocument fail to handle UTF-8 characters correctly when loading HTML?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn