为什么rawurldecode在解码%D时会返回一个空字符串?

时间:2012-08-23 19:17:08

标签: php

这让我发疯了。我想知道为什么在这个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()。非常感谢提前!

2 个答案:

答案 0 :(得分:1)

因为它将%DE解释为文字字符并将其解码为某个字符(222)。来自the docs

  

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

嗯,DE是有效的十六进制数字,因此,它会被替换。

真正的解决方案是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)

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

您正在运行$strhtmlspecialchars而没有告诉我们。我这样说是因为rawurldecode("<")不会给你&lt;。那么,考虑到这一点,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");