DOMDocument を使用して UTF-8 文字列を XML ファイルに書き込もうとすると、実際には文字列自体ではなく、文字列の 16 進数表記が書き込まれます。
例えば:
ירושלים
それ以外の:
ירושלים
問題を解決する方法はありますか?
DOMDocument を使用して UTF-8 文字列を XML ファイルに書き込もうとすると、実際には文字列自体ではなく、文字列の 16 進数表記が書き込まれます。
例えば:
ירושלים
それ以外の:
ירושלים
問題を解決する方法はありますか?
わかりました、ここに行きます:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->appendChild($dom->createElement('root'));
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();
この場合、作成したドキュメントは 2 番目の引数として指定されたエンコーディングを保持するため、問題なく動作します。
<?xml version="1.0" encoding="utf-8"?>
<root>ירושלים</root>
ただし、エンコーディングを指定しない Document に XML をロードすると、コンストラクターで宣言したものはすべて失われます。つまり、次のことを意味します。
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadXml('<root/>'); // missing prolog
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();
utf-8 のエンコーディングはありません:
<?xml version="1.0"?>
<root>ירושלים</root>
したがって、何かをロードする場合は、それが
$dom = new DOMDocument();
$dom->loadXml('<?xml version="1.0" encoding="utf-8"?><root/>');
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();
期待どおりに動作します。
別の方法として、ドキュメントを読み込んだ後にエンコーディングを指定することもできます。
どうやら documentElement を $node として saveXML に渡すと、これを回避できますが、その理由を理解しているとは言えません。
例えば
$dom->saveXML($dom->documentElement);
それよりも:
$dom->saveXML();
ソース: http://www.php.net/manual/en/domdocument.savexml.php#88525
$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
// dirty fix
foreach ($doc->childNodes as $item)
if ($item->nodeType == XML_PI_NODE)
$doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper
書き込み用に DOMDocument を作成したときに、次のパラメーターを追加しました。
dom = new DOMDocument('1.0','utf-8');
これらのパラメーターにより、UTF-8 文字列がそのまま書き込まれました。