DOMDocument の UTF-8 文字との闘い: 徹底的な調査
PHP のライブラリである DOMDocument は、本質的に HTML を処理するように設計されています。 ISO-8859-1 エンコーディングを使用します。ただし、UTF-8 でエンコードされた HTML を DOMDocument インスタンスにロードしようとすると、結果の出力に破損した utf-8 文字が表示される場合があります。
問題:
例提供されたコードは、次の UTF-8 でエンコードされた HTML 文字列をロードしようとします:
<code class="html"><html> <head> <meta charset="utf-8"> <title>Test!</title> </head> <body> <h1>☆ Hello ☆ World ☆</h1> </body> </html></code>
ただし、出力には、意図した文字ではなく HTML エンティティが含まれます:
<code class="html"><!DOCTYPE html> <html><head><meta charset="utf-8"><title>Test!</title></head><body> <h1>&acirc;&#152;&#134; Hello &acirc;&#152;&#134; World &acirc;&#152;&#134;</h1> </body></html></code>
解決策:
この問題を解決するには、主に 2 つのアプローチがあります。
1.文字を HTML エンティティに変換:
PHP の mb_convert_encoding 関数は、US-ASCII 範囲外の文字を対応する HTML エンティティに変換できます。これにより、DOMDocument が文字列
<code class="php">$us_ascii = mb_convert_encoding($utf_8, 'HTML-ENTITIES', 'UTF-8');</code>
2 を正しく解釈できるようになります。エンコーディング ヒントの指定:
DOMDocument は、Content-Type メタ タグを追加することで HTML 文字列のエンコーディングに関するヒントを得ることができます:
<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
ただし、メタ タグを直接追加することはできません。コード内の HTML 文字列に変更を加えると、検証エラーが発生する可能性があります。これを回避するには、メタ タグなしで文字列をロードし、insertBefore メソッドを使用してそれを head 要素の最初の子として追加します。
<code class="php">$dom = new DomDocument(); $dom->loadHTML($html); $head = $dom->getElementsByTagName('head')->item(0); $meta = $dom->createElement('meta'); $meta->setAttribute('http-equiv', 'content-type'); $meta->setAttribute('content', 'text/html; charset=utf-8'); $head->insertBefore($meta, $head->firstChild); $html = $dom->saveHTML();</code>
これらのメソッドのいずれかを採用することで、DOMDocument は効果的に処理できます。 UTF-8 でエンコードされた HTML により、非 US-ASCII 文字の正しい表現とデコードが保証されます。
以上がDOMDocument が UTF-8 文字に問題がある理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。