ホームページ >バックエンド開発 >PHPチュートリアル >PHP DOMDocument のloadHTML 関数が UTF-8 エンコーディングを正しく処理しないのはなぜですか?

PHP DOMDocument のloadHTML 関数が UTF-8 エンコーディングを正しく処理しないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-11 19:59:15978ブラウズ

Why is my PHP DOMDocument loadHTML function not handling UTF-8 encoding correctly?

PHP DOMDocument loadHTML が UTF-8 を正しくエンコードしていない

問題

DOMDocument を使用して HTML を解析していますが、エンコードが失われているようですHTMLをロードするとき。 HTML 内の日本語の文字は文字化けしたテキストに置き換えられますが、HTML 文字列を echo 経由で直接出力すると正しく表示されます。

原因

DOMDocument は入力文字列が ISO-8859-1 であると想定します。デフォルトでは (HTTP/1.1 のデフォルト文字セット)。 UTF-8 文字列を解析する場合、この誤った仮定により誤解が生じ、文字化けが発生します。

解決策

DOMDocument が HTML 文字列を正しいエンコーディングで確実にロードするには、いくつかのオプションがあります。

  1. XML エンコーディング宣言またはメタ文字セットを先頭に追加する宣言: HTML 文字列をロードする前に、 を追加します。または 。これにより、文字列は強制的に UTF-8 として扱われます。
  2. Use SmartDOMDocument: この外部ライブラリは、正しいエンコーディングを自動的に検出して処理する loadHTMLCharset 関数を提供します。
  3. 文字列を HTML エンティティに変換: PHP の mb_convert_encoding 関数は HTML を変換できます。 UTF-8 エンコーディングを使用して文字列を HTML エンティティに変換します。この変換された文字列を DOMDocument にロードします。
  4. Use mb_encode_numericentity: この関数は、数値エンティティを含む上位 ASCII バイトをエンコードし、ISO-8859-1 の制限があっても文字列を正しく解析できるようにします ( PHP8.2のみ)。

メタ文字セット宣言を使用した例を次に示します。

$profile = '<p>イリノイ州シカゴにて、アイルランド系の家庭に、9</p>';
$dom = new DOMDocument();

// Add meta charset declaration
$contentType = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
$dom->loadHTML($contentType . $profile);

echo $dom->saveHTML();

これにより、HTML 文字列が正しい UTF-8 エンコーディングでロードされます。 、元の日本語文字を保持します。

以上がPHP DOMDocument のloadHTML 関数が UTF-8 エンコーディングを正しく処理しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。