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) にデコードするためです。ドキュメントから:

パーセント (%) 記号の後に 2 つの 16 進数が続くシーケンスがリテラル文字に置き換えられた文字列を返します。

Dとは有効な 16進E数なので、置き換えられます。

本当の解決策は、文字列をfirstに渡すrawurlencode()ことです。その後、 でデコードでき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では特別な意味があります。UTF-8は、ちなみに、htmlspecialcharsPHP5.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 に答える