Aug 06 2008

DOMDocument::loadXML — кодировка UTF-8 для XML

Category: PHPIgor @ 18:49

Сегодня столкнулся с одним неприятным багом 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>&#x418;&#x43C;&#x44F;</name>   
   <description>Description</description>
</root>

После нескольких часов экспериментов выяснил, что никак её установить нельзя, но лекарство есть, и оно следующее: нужно добавить заголовок xml-файла с кодировкой. И вуаля — красота :), все стало работать. Надеюсь в версии PHP 6 они сделают поддержку UTF-8 получше.

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

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

Ссылки по теме:
DOMDocument::__construct
DOMDocument::loadXML
DomDocument — кодировка в HTML-документах

Tags:

5 Responses to “DOMDocument::loadXML — кодировка UTF-8 для XML”

  1. FX Poster says:

    Тема не раскрыта до конца. 😉 Я сам об этом уже давно хотел написать, но всё никак руки не доходят.

  2. Igor says:

    Ну это всего лишь частный случай, а не полноценная тема :)

  3. maniac says:

    под вечер уже весь мозг сломал с этой проблемой, а тут ваш пост =)
    спасибо

  4. Alexey Ilinsky says:

    Спасибо чторазьяснили вопрос с кодировкой
    Оказалось очень важным и при парсинге HTML наличие заголока с кодировкой
    Когда я добавил его все стало работать отлично :)

  5. Gruz says:

    Дуже дякую! Ось воно — щастя! Знайти цей пост про те довбане кодування і благословенні заголовки! Ще раз дякую!

    Гугл напишу догану, бо довго довелось цей пост шукати.

Leave a Reply to maniac