Сегодня столкнулся с одним неприятным багом 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 получше.
$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-документах
Август 6th, 2008 at 19:25
Тема не раскрыта до конца. 😉 Я сам об этом уже давно хотел написать, но всё никак руки не доходят.
Август 6th, 2008 at 22:49
Ну это всего лишь частный случай, а не полноценная тема
Июнь 24th, 2009 at 20:39
под вечер уже весь мозг сломал с этой проблемой, а тут ваш пост =)
спасибо
Март 6th, 2010 at 13:54
Спасибо чторазьяснили вопрос с кодировкой
Оказалось очень важным и при парсинге HTML наличие заголока с кодировкой
Когда я добавил его все стало работать отлично
Май 12th, 2012 at 20:21
Дуже дякую! Ось воно — щастя! Знайти цей пост про те довбане кодування і благословенні заголовки! Ще раз дякую!
Гугл напишу догану, бо довго довелось цей пост шукати.