这让我发疯了。我想知道为什么在这个PHP示例代码中:
$str = '<p>Delivery: %DELIVERY-STAMP%</p>';
$str = rawurldecode($str);
echo $str;
结果是一个空字符串。但在此:
$str = '<p>Delivery: % DELIVERY-STAMP%</p>';
$str = rawurldecode($str);
echo $str;
结果结果是
<p>Delivery: % DELIVERY-STAMP%</p>
唯一的区别是%D中的额外空格。换句话说,当字符串“%D”传递给rawurldecode()时会发生一些非常糟糕的事情,因为我总是得到一个空字符串作为结果。这可能是个错误?我在文档中找不到关于“%D”的任何参考。我正在使用PHP 5.4.2在实际代码中我无法避免运行rawurldecode()。非常感谢提前!
答案 0 :(得分:1)
因为它将%DE
解释为文字字符并将其解码为某个字符(222)。来自the docs:
返回一个字符串,其中包含百分号(%)的序列 后跟两个十六进制数字已被文字字符替换。
嗯,D
和E
是有效的十六进制数字,因此,它会被替换。
真正的解决方案是pass your string to 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
答案 1 :(得分:0)
在黑暗中拍摄,但这是我最好的猜测:
您正在运行$str
到htmlspecialchars
而没有告诉我们。我这样说是因为rawurldecode("<")
不会给你<
。那么,考虑到这一点,rawurldecode
实际给出了什么?它给出了这个:
&lt; p&gt;交货:ÞLIVERY-STAMP%&lt; / p&gt;
它之所以这样,是因为它将%DE
视为网址编码字符串并将其解码为Latin Capital Letter Thorn
。不过这是一个问题。该字符在0-127范围之外,因此在UTF-8中具有特殊含义,顺便说一下,它是PHP {5.4}中默认的htmlspecialchars
。
直接结果是,你有“格式错误的UTF-8”(实际上是完全有效的Windows-1252),结果是一个空字符串。
我不知道您为什么首先使用rawurldecode
,因为如果您有一个编码字符串,它首先不会有<
(而是%3C
)。所以试试这个:
$str = '<p>Delivery: %DELIVERY-STAMP%</p>';
echo htmlspecialchars(utf8_encode($str));
OR
echo htmlspecialchars($str,ENT_COMPAT,"ISO-8859-1");