Php 如何为libxml2指定默认输出编码,以防止属性中过度热心的实体转义?

Php 如何为libxml2指定默认输出编码,以防止属性中过度热心的实体转义?,php,attributes,libxml2,html-entities,Php,Attributes,Libxml2,Html Entities,看来这个问题又折磨我了。不久前我问过dba类似的问题,认为这只是一个PostgreSQL问题,但现在它困扰着我的php。但常见的是底层libxml2库 我的经验使我相信,有些操作会将属性值(并且仅在属性值中)中的所有非拉丁字符转换为转义实体,即&35;xHEX。看起来好像在一个属性中,编写器忘记了它应该默认为UTF-8并采用ASCII。有一些操作可以用来缓解这个问题(如下面的代码所示),但并不总是可行的(比如在PostgreSQL的存储函数中) 显示问题的代码 <?php $xml = &

看来这个问题又折磨我了。不久前我问过dba类似的问题,认为这只是一个PostgreSQL问题,但现在它困扰着我的php。但常见的是底层libxml2库

我的经验使我相信,有些操作会将属性值(并且仅在属性值中)中的所有非拉丁字符转换为转义实体,即
&35;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";
?>
read();
echo$r->readOuterXml(),“\n”;
$n=$r->展开(新的DomDocument());
echo$n->ownerDocument->saveXml($n),“\n”;
$n=$r->扩展(新的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中是否有任何设置或某些东西可以全局设置默认的输出编码,而不管输入或甚至是省略的编码是什么?

这是libxml2中的一个错误,我对此进行了分析


请注意,您仍然必须在XML声明中提供显式UTF-8编码。

非常感谢!遗憾的是,目前还没有通用的方法来设置输出编码,但这将在时间上有所帮助。顺便说一句,你能看看第1点吗?结果是一样的,但罪魁祸首是XPath计算。提前感谢。@IvanUstèèèanin可能通过始终添加UTF-8编码的XML声明来解决Postgres问题:
不幸的是,它没有帮助:
SELECT(xpath('*','СèèèСèèanin')[1]::text
仍然返回
,请看我在网站上的帖子。如果能做到这一点,那将是一件幸事。我希望你能做到这一点。关于打破现状,目前的情况似乎更糟,而且现在在非UTF-8上下文中使用xml文档几乎是胡说八道。