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="&#x420;&#x423;&#x421;&#x421;&#x41A;&#x418;&#x419; &#x410;&#x412;&#x422;&#x41E;&#x420;">&#x41A;&#x41D;&#x418;&#x413;&#x410; &#x420;&#x423;&#x421;&#x421;&#x41A;&#x418;&#x41C;&#x418; &#x411;&#x423;&#x41A;&#x412;&#x410;&#x41C;&#x418;
  </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>

Павел Волынцев

Уже более 15 лет занимаюсь разработкой веб-проектов. Fullstack Senior Developer. IT евангелист — доношу свет знаний об информационных технологиях. Профессиональные цели: Дать людям возможность дать людям больше.

Читайте также:

  • Gap

    Спасибо, помогло.

    • Всегда пожалуйста

  • Maria Parshina

    Спасибо! Очень доходчиво! 🙂

    • Пожалуйста