Кажется, эта проблема снова кусает меня.Некоторое время назад я спросил что-то похожее на dba, думая, что это только проблема PostgreSQL, но, увы, теперь это беспокоит меня в php.Но общей вещью является лежащая в основе библиотека libxml2.
Мой опыт подсказывает, что некоторые операции преобразуют все нелатинские символы в значениях атрибутов (и только в значениях атрибутов) в escape-сущности, то есть &#xHEX;
.Похоже, что внутри атрибута автор забывает, что он должен по умолчанию использовать UTF-8, и принимает ASCII.Есть некоторые манипуляции, которые могут быть выполнены для смягчения этой проблемы (как показано в приведенном ниже коде), но это не всегда возможно (например, внутри хранимой функции PostgreSQL).
Код, показывающий проблему
<?php
$xml = <<<'XML'
<?xml version='1.0' encoding='UTF-8'?>
<root><элемент атрибут=""знач."">текст</элемент></root>
XML;
$r = new XMLReader();
$r->xml($xml);
do {
$r->read();
} while ($r->nodeType != XMLReader::ELEMENT);
$r->read();
echo $r->readOuterXml(), "\n";
$n = $r->expand(new DomDocument());
echo $n->ownerDocument->saveXml($n), "\n";
$n = $r->expand(new DomDocument('1.0', 'UTF-8'));
echo $n->ownerDocument->saveXml($n), "\n";
?>
выходы
<элемент атрибут=""знач."">текст</элемент>
<элемент атрибут=""знач."">текст</элемент>
<элемент атрибут=""знач."">текст</элемент>
Последний результат, который я получаю, - последний.
Таким образом, вопрос: естькакой-либо параметр или что-то в libxml2, чтобы каким-то образом глобально установить кодировку вывода по умолчанию, несмотря на ввод или даже пропущенную?