77431


下記のコードで日本語部分がエンティティ化されてしまいます。

`$newdoc->importNode($el, true)` で発生しているようなのですが、  
理由と対策を教えてください。

[code]

    $orgdoc = new DOMDocument;
    $orgdoc->loadXML("<old><span>あいうえお1</span><span>あいうえお2<span>あいうえお3</span></span></old>");
    $node = $orgdoc->getElementsByTagName("old")->item(0);
    
    $newdoc = new DOMDocument;
    $newdoc->loadXML("<new></new>");
    
    foreach($node->childNodes as $el){
      $el = $newdoc->importNode($el, true);
      $newdoc->documentElement->appendChild($el);
    }
    
    echo $newdoc->saveHTML();
    
[/code]

## 実行結果

[code]

    <new><span>&#12354;&#12356;&#12358;&#12360;&#12362;1</span><span>&#12354;&#12356;&#12358;&#12360;&#12362;2<span>&#12354;&#12356;&#12358;&#12360;&#12362;3</span></span></new>
    
[/code]

## 試したこと

下記を追加してみましたが、改善しませんでした。

[code]

    $orgdoc->substituteEntities = false;
    
[/code]


CC BY-SA 4.0
2021-06-09T06:33:20.870
77425
2021-06-09T10:03:56.547
46729
question
php html dom
PHP DOMDocument HTMLエンティティ化


まず、対策については `saveHTML()` ではなく `saveXML()` を使います。単に `saveXML()` とすると XML
Declaration も表示されてしまいますので `documentElement` を指定しています。

[code]

    echo $newdoc->saveXML($newdoc->documentElement);
    
[/code]

`saveHTML()` を使いたい場合は HTML entity を UTF-8 へ変換します。

[code]

    echo mb_convert_encoding($newdoc->saveHTML(), 'UTF-8', 'HTML-ENTITIES');
    
[/code]

理由に関してですが、`saveHTML()` の場合、HTML ドキュメントのヘッダ部にある文字エンコーディングの指定を参照しているからです。

[code]

    $newdoc->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'."<p></p>");
                :
    
    echo $newdoc->saveHTML();
    
    // 出力結果
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><p></p></body><span>あいうえお1</span><span>あいうえお2<span>あいうえお3</span></span></html>
    
[/code]


CC BY-SA 4.0
2021-06-09T10:03:56.547
77431
2021-06-09T10:03:56.547
77425
answer