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>