cURLを使用して、PHPでAJAXによって作成されたPOSTリクエストを模倣しようとしています。
私が気づいたことの1つは、%27
JSのencodeuricomponentがそれをそのままにしているのに、PHPが一重引用符をエスケープするのはなぜですか?
実際にJSと同じ関数がPHPに本当にありますか?
一重引用符をエンコードしない PHP 関数はありません。その理由は、PHPが一重引用符を含むRFC 3986により厳密に準拠しているためです。
RFC 3986
などの特殊文字を予約し!, ', (, ), and *
ます。
URI には、「予約済み」セットの文字で区切られたコンポーネントとサブコンポーネントが含まれます。これらの文字は 、一般的な構文、各スキーム固有の構文、または URI の逆参照アルゴリズムの実装固有の構文によって
区切り文字として定義される (または定義されない) ため、「予約済み」と呼ばれます。 URI コンポーネントのデータが 区切り文字としての予約文字の目的と競合する場合、URI を形成する前に、競合するデータをパーセントでエンコードする必要があります。予約済み = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
サブデリム = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
php に一致させ、一重引用符を js でエンコードしたい場合は、次のような関数を使用できます。
function fixedEncodeURIComponent (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, escape);
}
なぜエンコードしない必要があるのですか?CURL でも動作するはずです。