Когда я пытаюсь записать строки UTF-8 в файл XML с использованием DomDocument, он фактически записывает шестнадцатеричное представление строки вместо самой строки.
например:
ירושלים
вместо: ירושלים
есть идеи, как решить проблему?
Хорошо, давайте:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->appendChild($dom->createElement('root'));
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();
будет работать нормально, потому что в этом случае созданный вами документ сохранит кодировку, указанную в качестве второго аргумента:
<?xml version="1.0" encoding="utf-8"?>
<root>ירושלים</root>
Однако, как только вы загрузите 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>
Поэтому, если вы что-то загружаете в XML, убедитесь, что это
$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
Когда я создавал DomDocument для записи, я добавил следующие параметры:
dom = new DOMDocument('1.0','utf-8');
эти параметры заставляли строку UTF-8 записываться как есть.