0

这真让我抓狂。我想知道为什么在这个 PHP 示例代码中:

$str = '<p>Delivery: %DELIVERY-STAMP%</p>';
$str = rawurldecode($str);
echo $str;

结果是一个空字符串。但在这:

$str = '<p>Delivery: % DELIVERY-STAMP%</p>';
$str = rawurldecode($str);
echo $str;

结果结果是

&lt;p&gt;Delivery: % DELIVERY-STAMP%&lt;/p&gt;

唯一的区别是 %D 中的额外空间。换句话说,当字符串“%D”被传递给 rawurldecode() 时会发生一些非常糟糕的事情,因为我总是得到一个空字符串作为结果。这可能是一个错误?我在文档中找不到任何关于“%D”的参考资料。我在实际代码中使用 PHP 5.4.2,我无法避免运行 rawurldecode()。提前谢谢了!

4

2 回答 2

1

因为它被解释%DE为文字字符并将其解码为某个字符(222)。从文档

返回一个字符串,其中带有百分号 (%) 符号后跟两个十六进制数字的序列已被替换为文字字符。

嗯,D并且E是有效的十六进制数字,所以,它被替换了。

真正的解决方案是将您的字符串传递给rawurlencode()first,然后您可以使用 对其进行解码rawurldecode(),因为为了解码某些内容,需要对其进行正确编码。

$str = rawurlencode( '<p>Delivery: %DELIVERY-STAMP%</p>');
$str = rawurldecode($str);
echo $str;

正确编码的输入字符串如下所示:

%3Cp%3EDelivery%3A%20%25DELIVERY-STAMP%25%3C%2Fp%3E
于 2012-08-23T19:23:26.190 回答
0

在黑暗中拍摄,但这是我最好的猜测:

你在没有告诉我们的情况下一直在$str运行htmlspecialchars。我之所以这么说是因为rawurldecode("<")不会给你&lt;。那么,考虑到这一点,rawurldecode实际上给出了什么?它给出了这个:

<p>交货:ÞLIVERY-STAMP%</p>

它给出了这个,因为它认为%DE是一个 URL 编码的字符串并将其解码为Latin Capital Letter Thorn. 不过,这就是问题所在。该字符在 0-127 范围之外,因此在 UTF-8 中具有特殊含义,顺便说一下,这是htmlspecialcharsPHP 5.4 中的默认值。

作为直接结果,您有“格式错误的 UTF-8”(实际上是完全有效的 Windows-1252),结果是一个空字符串。

我不知道你为什么首先使用rawurldecode它,因为如果你有一个编码字符串,它一开始就没有<(而是%3C)。所以试试这个:

$str = '<p>Delivery: %DELIVERY-STAMP%</p>';
echo htmlspecialchars(utf8_encode($str));

或者

echo htmlspecialchars($str,ENT_COMPAT,"ISO-8859-1");
于 2012-08-23T19:25:23.630 回答