Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Проблема с кодировкой UTF-8 для XML

Столкнулся с одним неприятным багом PHP при работе с XML с кодировкой UTF-8. Если воспользоваться функцией DOMDocument::loadXML.

Есть исходный xml-файл: 1.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <name>Имя</name>
   <description>Description</description>
</root>

Теперь хотим воспользоваться DOMDocument и подгрузить файл, далее дампим его содержимое на экран. В этом примере все будет работать на ура и результат будет идентичен файлу 1.xml.

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->load('1.xml');
echo $dom->saveXML();

Рассмотрим другую ситуацию, когда мы xml-данные как-то получаем, меняем, добавляем и в итоге передаем строку в функцию loadXML.

$xml = <<<XML
<root>
   <name>Имя</name>
   <description>Description</description>
</root>
XML;

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML($xml);
echo $dom->saveXML();

А на выходе получаем нижеследующее. Куда делись наши символы на русском? И исчезла кодировка UTF-8?

<?xml version="1.0"?>
<root>
   <name>Имя</name>
   <description>Description</description>
</root>

Решение: нужно добавить заголовок xml-файла с кодировкой. Надеюсь, в версии PHP 6 они сделают поддержку UTF-8 получше.

<?
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML('<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $xml);
echo $dom->saveXML();
?>

.