Как указать выходную кодировку по умолчанию для libxml2, чтобы предотвратить чрезмерное экранирование сущностей в атрибутах? - PullRequest
0 голосов
/ 24 сентября 2018

Кажется, эта проблема снова кусает меня.Некоторое время назад я спросил что-то похожее на dba, думая, что это только проблема PostgreSQL, но, увы, теперь это беспокоит меня в php.Но общей вещью является лежащая в основе библиотека libxml2.

Мой опыт подсказывает, что некоторые операции преобразуют все нелатинские символы в значениях атрибутов (и только в значениях атрибутов) в escape-сущности, то есть &#xHEX;.Похоже, что внутри атрибута автор забывает, что он должен по умолчанию использовать UTF-8, и принимает ASCII.Есть некоторые манипуляции, которые могут быть выполнены для смягчения этой проблемы (как показано в приведенном ниже коде), но это не всегда возможно (например, внутри хранимой функции PostgreSQL).

Код, показывающий проблему

<?php
$xml = <<<'XML'
<?xml version='1.0' encoding='UTF-8'?>
<root><элемент атрибут="&quot;знач.&quot;">текст</элемент></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";
?>

выходы

<элемент атрибут="&quot;&#x437;&#x43D;&#x430;&#x447;.&quot;">текст</элемент>
<элемент атрибут="&quot;&#x437;&#x43D;&#x430;&#x447;.&quot;">текст</элемент>
<элемент атрибут="&quot;знач.&quot;">текст</элемент>

Последний результат, который я получаю, - последний.

Таким образом, вопрос: естькакой-либо параметр или что-то в libxml2, чтобы каким-то образом глобально установить кодировку вывода по умолчанию, несмотря на ввод или даже пропущенную?

1 Ответ

0 голосов
/ 25 сентября 2018

Это ошибка в libxml2, которую я только что исправил .

Обратите внимание, что вы все равно должны предоставить явную кодировку UTF-8 в декларации XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...