SimpleXML and XML encoding UTF8
Недавно столкнулся с такой штукой
<?php $xml = new SimpleXMLElement('<books/>'); $childNode = $xml->addChild('book', 'КНИГА РУССКИМИ БУКВАМИ'); $childNode->addAttribute('author', 'РУССКИЙ АВТОР'); $xmlPlain = $xml->asXML(); echo $xmlPlain; ?>
Получил на выходе вот такой код: явно htmlentities или иной способ преобразования кириллицы в безопасный текст.
<?xml version="1.0"?> <books> <book author="РУССКИЙ АВТОР">КНИГА РУССКИМИ БУКВАМИ </book> </books>
Вот таким способом можно попытаться вернуть htmlentities в кирилицу
<?php //... $xmlPlain = $xml->asXML(); echo html_entity_decode($xmlPlain, ENT_NOQUOTES, 'UTF-8'); ?>
При этом коды символов преобразуются обратно в кириллический текст, получится вот что:
<?xml version="1.0"?> <books><book author="РУССКИЙ АВТОР">КНИГА РУССКИМИ БУКВАМИ</book></books>
Это почти ожидаемый результат за исключением того, что он, вероятно, не правильно будет прочитан, потому что не указана служебная информация о кодировке.
Можно сделать так:
<?php //... $xmlPlain = $xml->asXML(); echo preg_replace(/* заменить <?xml version="1.0"?> на <?xml version="1.0" encoding="UTF-8"?> */); ?>
Но гораздо проще с самого начала указать, что объект SimpleXMLElement будет в определённой кодировке. Это делается так:
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?><books/>"); // ...
Полностью код выглядит так:
<?php $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><books/>'); $childNode = $xml->addChild('book', 'КНИГА РУССКИМИ БУКВАМИ'); $childNode->addAttribute('author', 'РУССКИЙ АВТОР'); $xmlPlain = $xml->asXML(); echo $xmlPlain; ?>
Вот что получилось:
<?xml version="1.0" encoding="UTF-8"?> <books><book author="РУССКИЙ АВТОР">КНИГА РУССКИМИ БУКВАМИ</book></books>