トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP5、SimpleXML->asXML()でマルチバイト文字が数値文字参照になってしまう?

[カテゴリ:言語]
[カテゴリ:PHP]
[カテゴリ:PHP5]

PHP5、SimpleXML->asXML()でマルチバイト文字が数値文字参照になってしまう?

適切なXML宣言がないのが原因。

日本語文字が数値文字参照になる例

再現スクリプト

<?

function test($xml_)
{
    $simplexml = simplexml_load_string($xml_);
    
    echo '↓↓↓文字列→SimpleXML <br />';
    $str = print_r($simplexml, true);
    echo '<pre>';
    echo htmlentities($str, ENT_QUOTES, mb_internal_encoding());
    echo '</pre>';
        
    echo '↓↓↓SimpleXML→文字列 <br />';
    $str = $simplexml->asXML();
    echo '<pre>';
    echo htmlentities($str, ENT_QUOTES, mb_internal_encoding());
    echo '</pre>';
}

$xml = '
<html>
<body>
<p>aiueo</p>
<p>あいうえお</p>
</body>
</html>
';
test($xml);

?>

結果

↓↓↓文字列→SimpleXML 

SimpleXMLElement Object
(
    [body] => SimpleXMLElement Object
        (
            [p] => Array
                (
                    [0] => aiueo
                    [1] => あいうえお
                )

        )

)

↓↓↓SimpleXML→文字列 

<?xml version="1.0"?>
<html>
<body>
<p>aiueo</p>
<p>&#x3042;&#x3044;&#x3046;&#x3048;&#x304A;</p> ←数値文字参照になってしまった。
</body>
</html>

回避方法

先頭行にXML宣言を付けエンコーディングを明示する。

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
<p>aiueo</p>
<p>あいうえお</p>
</body>
</html>
';

実行結果

↓↓↓文字列→SimpleXML 

SimpleXMLElement Object
(
    [body] => SimpleXMLElement Object
        (
            [p] => Array
                (
                    [0] => aiueo
                    [1] => あいうえお
                )

        )

)

↓↓↓SimpleXML→文字列 

<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
<p>aiueo</p>
<p>あいうえお</p>
</body>
</html>

最終更新時間:2007年10月21日 22時20分34秒