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>☆ Hello ☆ World ☆
プログラム:
<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 Latin Alphabet No. 1) をデフォルトの文字エンコーディングとして利用します。したがって、HTML 4.0 用に設計された HTML パーサーがこのエンコーディングを超える文字に遭遇すると、予期しない動作を示す可能性があります。
非 ASCII 文字をエンティティに変換する
この問題を修正するには、ASCII 範囲 (127 / h7F) の外にあるすべての文字を HTML エンティティに変換する必要があります。このプロセスは、HTML-ENTITIES ターゲット エンコーディングで mb_convert_encoding を使用して実現できます。
<code class="php">$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");</code>
Content-Type Meta Tag の追加
または、問題は次のように解決できます。 を組み込むタグをドキュメント自体に挿入し、文字セットを UTF-8 として指定します。
<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
このメソッドは DOMDocument へのヒントとして機能し、入力を UTF-8 でエンコードされたものとして強制的に解釈します。
の外側に配置されている場合でも、セクションの HTML 2.0 仕様では、そのような要素はヘッダー内で自動的に再配置されることが規定されています。以上がHTML をロードするときに DOMDocument が UTF-8 文字を正しく処理できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。