编码'是XML安全的

时间:2015-03-27 10:20:53

标签: php xml html-entities htmlspecialchars

我有一个包含正确单引号的字符串:

$str = "David’s Spade";

我通过XML发送字符串并需要对其进行编码。我已经读过我应该使用htmlspecialchars对字符串进行编码,但我发现XML请求仍然失败而htmlentities有效。

当我error_log $ str:

$str; // David\xe2\x80\x99s Spade
htmlspecialchars($str); // David\xe2\x80\x99s Spade
htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); // David\xe2\x80\x99s Spade
htmlentities($str); // David’s Spade

str_replace ’然后使用htmlentities会更好吗?是否有其他字符可能会遗漏?

1 个答案:

答案 0 :(得分:1)

  

我通过XML发送字符串并需要对其进行编码。

不,你没有。如果XML是UTF-8编码(默认情况下),并且$str是UTF-8编码的(正如您在问题中通过二进制序列显示的那样),则无需对其进行编码。

这是本书。因此,根据您与之合作的数据的技术信息,这很清楚也很好。

然后你写下一些事情是有效的,有些则不然。无论你在那里做什么,问题都存在于你从问题中隐藏的事物中。

更明确地说明这一点:

$str = "David’s Spade"; // "David\xE2\x80\x99s Spade"

是一个完全有效的字符串,例如将它与Simplexml之类的XML库一起使用以将其添加到XML文档中:

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><doc/>');
$xml->element = $str;
$xml->asXML('php://output');

输出:

<?xml version="1.0" encoding="UTF-8"?>
<doc><element>David’s Spade</element></doc>

正如您所看到的,XML已经通过不改变字符串的字节序列进行编码,因为它是UTF-8。

我们采取一些ASCII:

$xml = new SimpleXMLElement('<doc/>');
$xml->element = $str;
$xml->asXML('php://output');

输出:

<?xml version="1.0"?>
<doc><element>David&#x2019;s Spade</element></doc>

如本例所示,它依赖于文档编码。第二个例子是Simplexml的后退,以使输出更加健壮,但实际上这不是必需的,因为UTF-8将是默认编码。

在任何情况下,您都不应该过分关注自己使用专门创建XML文档的库进行编码。 PHP有一些正是如此。拿一个。