如何在PHP的XML输出中转义商标和版权字符


How to escape Trademark and Copyright characters in XML output from PHP

我的PHP应用程序正在输出一个XML文件,其中一些输出可能包含商标和/或版权字符。有没有办法在输出中转义这些字符?

谢谢!

在XML中唯一需要转义的特殊字符是:

  • < - &lt;
  • > - &gt;
  • & - &amp;
  • " - &quot;
  • ' - &apos; / &#39;

可以在属性值或文本节点中使用转义的变体。以下两个示例表示相同的内容。

<foo>&lt;Hello@World&gt;</foo>
<foo><![CDATA[<Hello@World>]]></foo>

<foo/>的nodeValue始终为<Hello@World>

第一个是文本节点,第二个是cdata部分。在cdata部分中,不允许实体,并且禁止序列]]>。如果CDATA部分包含]]>,DOM将自动拆分该部分。

其他特殊字符(如©)只有在您的XML没有使用支持unicode的编码时才需要转义。如果您想要一个简单的ASCII XML,您可以将特殊字符编写为数字字符引用。数字是Unicode中字符的代码点。

  • © - &#169; / &#xA9;

架构和DTD可以定义命名字符实体引用。这些在XML中不可用,但可以以基于XML的格式提供。(X) HTML就是一个例子。

  • © - &copy;

如果您使用DOM,它会根据需要处理它。

在UTF-8中,只有XML特殊字符会被转义。

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->appendChild($dom->createElement('foo'));
$dom->documentElement->appendChild($dom->createTextNode('<©€äöü>'));
echo $dom->saveXml();

输出:

<?xml version="1.0" encoding="UTF-8"?>
<foo>&lt;©€äöü&gt;</foo>

在ASCII中,将有更多的内容被转义:

$dom = new DOMDocument('1.0', 'ASCII');
$dom->appendChild($dom->createElement('foo'));
$dom->documentElement->appendChild($dom->createTextNode('<©€äöü>'));
echo $dom->saveXml();

输出:

<?xml version="1.0" encoding="ASCII"?>
<foo>&lt;&#169;&#8364;&#228;&#246;&#252;&gt;</foo>