编码&;rsquo的;以确保XML安全


Encode ’ to be XML safe

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

$str = "David’s Spade";

我正在通过XML发送字符串,需要对其进行编码。我读到应该使用htmlspecialchar对字符串进行编码,但我发现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会更好吗?还有其他字符可能遗漏吗?

我通过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有一些正是这样的。拿一个。