我有一个包含右单引号的字符串:
$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’s Spade</element></doc>
如本例所示,这取决于文档编码。第二个例子是Simplexml的一个回退,以使输出更加健壮,但实际上这并不是必要的,因为UTF-8将是默认编码。
在任何情况下,您都不应该过于担心使用专门用于创建XML文档的库来对自己进行编码。PHP有一些正是这样的。拿一个。