【问题标题】:SimpleXML outputs unicode in a strange waySimpleXML 以一种奇怪的方式输出 unicode
【发布时间】:2013-08-01 12:30:15
【问题描述】:

我使用 simpleXML 来处理 xml 文件。它有西里尔字母。我还使用dom_import_simplexml、importNode 和appendChild 将树从一个文件复制到另一个文件并从一个地方复制到另一个地方。 在处理结束时,我执行print_r 的结果simpleXmlElement,一切正常。但我也这样做了asXml('outputfile.xml') 并且发生了一些奇怪的事情:所有没有用CDATA 包裹的西里尔字符(一些标签主体和所有属性)都更改为它们的 unicode 代码。

例如print_r的输出(只是一个片段):

SimpleXMLElement Object ( [@attributes] => Array 
             ( [NAME] => Государственный аппарат и     механизм 
               [COSTYES] => 3.89983579639 [COSTNO] => 0 
               [ID] => 9 )
           [COMMENTYES] => Вы совершенно         правы. 
          [COMMENTNO] => Нет, Вы ошиблись. ) ) )

但在asXml 生成的文件中,我得到如下内容:

<QUEST NAME="&#x422;&#x435;&#x43E;&#x440;&#x438;&#x44F;#x434;&#x432;&#x443;&#x445;&#x43C;&#x435;&#x447;&#x435;&#x439;"     
    style="educ" ID="1">
  <DESC><![CDATA[Теория происхождения государства, известная как теория "двух мечей" [2, с.40], 
    представляет из себя...
  ]]></DESC>`

我在任何可能的地方都设置了 utf-8 语言环境,用谷歌搜索了“simplexml、unicode、西里尔文、asXml 等”的每个组合,但没有任何效果。

UPD 看起来像 htmlentities() 使用的某些函数。因此,感谢voitcus,解决方案是按照here 的建议使用html_entity_decode()。

【问题讨论】:

标签: php unicode internationalization simplexml cyrillic


【解决方案1】:

我想知道你最初导入 xml 文档时可能没有声明编码。以下两个给你不同的输出。

$simplexml = simplexml_load_string('<QUEST NAME="Государственный" />');
if (!$simplexml) { exit('parse failed'); }
print_r($simplexml->asXml());

$simplexml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><QUEST NAME="Государственный" />');
if (!$simplexml) { exit('parse failed'); }
print_r($simplexml->asXml());

SimpleXMLElement 对象从原始 xml 声明中知道自己的编码,如果没有声明,我猜它会生成数字字符引用以确保安全。

【讨论】:

  • 在xml文件中声明了编码,并且设置了与locale相同的编码。问题出在htmlentities,请参阅我帖子的 cmets 并在其中更新。
  • 请运行我的示例。即使没有 CDATA,第二个也不会对它们进行编码。您可能需要制作最短的代码来重现您执行 importNode/appendChild 的问题。
猜你喜欢
  • 2013-09-29
  • 2017-01-17
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多