12

DOMDocument を使用して UTF-8 文字列を XML ファイルに書き込もうとすると、実際には文字列自体ではなく、文字列の 16 進数表記が書き込まれます。

例えば:

ירושלים

それ以外の:

ירושלים

問題を解決する方法はありますか?

4

6 に答える 6

18

わかりました、ここに行きます:

$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>&#x5D9;&#x5E8;&#x5D5;&#x5E9;&#x5DC;&#x5D9;&#x5DD;</root>

したがって、何かをロードする場合は、それが

$dom = new DOMDocument();
$dom->loadXml('<?xml version="1.0" encoding="utf-8"?><root/>');
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

期待どおりに動作します。

別の方法として、ドキュメントを読み込んだ後にエンコーディングを指定することもできます。

于 2010-08-26T13:08:03.743 に答える
3

どうやら documentElement を $node として saveXML に渡すと、これを回避できますが、その理由を理解しているとは言えません。

例えば

$dom->saveXML($dom->documentElement);

それよりも:

$dom->saveXML();

ソース: http://www.php.net/manual/en/domdocument.savexml.php#88525

于 2010-08-26T12:52:02.260 に答える
0
$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
于 2013-03-25T09:56:35.433 に答える
0

書き込み用に DOMDocument を作成したときに、次のパラメーターを追加しました。

dom = new DOMDocument('1.0','utf-8');

これらのパラメーターにより、UTF-8 文字列がそのまま書き込まれました。

于 2010-08-26T13:04:41.630 に答える