0

I'm trying to parse a simple HTML containing Chinese characters inside script tag. However, after processing by PHP DomDocument, those are converted to some weird characters.

<?php

$html = <<<EOD
<!DOCTYPE html>
<html>
    <head>
        <script>
            const str = "訂閱最新指南";
        </script>
    </head>
    <body>
    </body>
</html>
EOD;

$dom = new DOMDocument();
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
$dom->loadHTML($html);

// Trying different approaches to get correct output
echo $dom->saveHTMl();
echo $dom->saveHTML($dom->documentElement);
echo utf8_decode($dom->saveHTML($dom->documentElement));
echo utf8_decode($dom->saveHTML());

Output:

<!DOCTYPE html>
<html>
    <head>
        <script>
            const str = "&#35330;&#38321;&#26368;&#26032;&#25351;&#21335;";
        </script>
    </head>
    <body>
    </body>
</html>
<html>
    <head>
        <script>
            const str = "&#35330;&#38321;&#26368;&#26032;&#25351;&#21335;";
        </script>
    </head>
    <body>
    </body>
</html><html>
    <head>
        <script>
            const str = "&#35330;&#38321;&#26368;&#26032;&#25351;&#21335;";
        </script>
    </head>
    <body>
    </body>
</html><!DOCTYPE html>
<html>
    <head>
        <script>
            const str = "&#35330;&#38321;&#26368;&#26032;&#25351;&#21335;";
        </script>
    </head>
    <body>
    </body>
</html>
Gijo Varghese
  • 11,264
  • 22
  • 73
  • 122

1 Answers1

2

Seems to working without the mb_convert_encoding:

<?php

$html = <<<EOD
<!DOCTYPE html>
<html>
    <head>
        <script>
            const str = "訂閱最新指南";
        </script>
    </head>
    <body>
    </body>
</html>
EOD;

$dom = new DOMDocument();

$dom->loadHTML($html);

echo utf8_decode($dom->saveHTML($dom->documentElement));

result:

<html>
<head><script>
            const str = "訂閱最新指南";
        </script></head>
<body>
    </body>
</html>

with mb_convert_encoding:

<?php

$html = <<<EOD
<!DOCTYPE html>
<html>
    <head>
        <script>
            const str = "訂閱最新指南";
        </script>
    </head>
    <body>
    </body>
</html>
EOD;

$dom = new DOMDocument();
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
$dom->loadHTML($html);

echo html_entity_decode($dom->saveHTML($dom->documentElement));

result:

<html><head><script>
            const str = "訂閱最新指南";
        </script></head><body>
    </body></html>
MaartenDev
  • 5,631
  • 5
  • 21
  • 33