2

次の関数を使用して、html文字列の内部htmlを取得しています

function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
        $tmp_dom = new DOMDocument('1.0', 'UTF-8');
        $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
        $innerHTML .= trim($tmp_dom->saveHTML()); 
    }

    return $innerHTML; 
} 

私のhtml文字列にはユニコード文字も含まれています。これはhtml文字列の例です

$html = '<div>Thats True. Yes it is well defined آپ مجھے تم کہہ کر پکاریں</div>';

上記の機能を使用すると

$output = DOMinnerHTML($html);

出力は以下のとおりです

$output = '<div>Thats True. Yes it is well defined 
&#1705;&#1746;&#1748;&#1587;&#1604;&#1591;&#1575</div>';

数値に変換された実際の Unicode 文字。

コードをデバッグしたところ、次の行の前に DOMinnerHTML 関数であることがわかりました

$innerHTML .= trim($tmp_dom->saveHTML()); 

私が反響すれば

echo $tmp_dom->textContent;

実際のユニコード文字が表示されますが、保存する$innerHTMLと数字記号が出力されます。なぜそれをしているのか。

注: 数値記号を実際の Unicode 文字に変換する html_entity_decode のような関数を提案しないでください。変換したくない html 文字列にユーザー形式のデータも含まれているためです。

注:私も入れてみました

<meta http-equiv="content-type" content="text/html; charset=utf-8">

私のhtml文字列の前ですが、違いはありません。

4

3 に答える 3

1

同様の問題がありました。上記のコメントを読んだ後、さらに調査した結果、非常に簡単な解決策を見つけました。

次のように、 を使用html_entity_decode()して の出力を変換するだけです。saveHTML()

// Create a new dom document
$dom = new DOMDocument();


// .... Do some stuff, adding nodes, ...etc.


// the html_entity_decode function will solve the unicode issue you described
$result = html_entity_decode($dom->saveHTML();

// echo your output
echo $result;

これにより、Unicode 文字が正しく表示されるようになります。

于 2013-07-13T05:18:33.050 に答える