ホームページ  >  記事  >  バックエンド開発  >  DOMDocument が UTF-8 文字に問題がある理由とその修正方法

DOMDocument が UTF-8 文字に問題がある理由とその修正方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-04 09:55:02726ブラウズ

Why Does DOMDocument Struggle with UTF-8 Characters and How to Fix It?

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>&amp;acirc;&amp;#152;&amp;#134; Hello &amp;acirc;&amp;#152;&amp;#134; World &amp;acirc;&amp;#152;&amp;#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 サイトの他の関連記事を参照してください。

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