1. ホーム
  2. php

[解決済み】urlencodeとrawurlencodeの比較?

2022-04-15 18:12:48

質問

変数を使用してURLを作成したい場合、文字列をエンコードするために2つの選択肢があります。 urlencode()rawurlencode() .

具体的にはどのような違いがあり、どちらが好ましいのでしょうか?

どのように解決するのですか?

目的によって異なります。他のシステムとの相互運用性が重要な場合は、rawurlencodeが適していると思われます。例外は、クエリー文字列が%20の代わりに+としてエンコードされるフォームエンコードスタイルに従うことを期待するレガシーシステムです(この場合、urlencodeが必要です)。

生urlencode は、PHP 5.3.0 以前の RFC 1738 とそれ以降の RFC 3986 に従っています( http://us2.php.net/manual/en/function.rawurlencode.php )

英数字以外の文字(-_.~を除く)をパーセント記号とそれに続く2桁の16進数で置き換えた文字列を返します。これは " RFC 3986 で説明されているエンコーディングで、リテラル文字が特殊な URL 区切り文字として解釈されないようにしたり、 URL が (一部のメールシステムなどの) 文字変換を行う伝送メディアで乱雑に扱われないようにしたりするためのものです。

RFC 3986 と 1738 の比較に関する注意点 php 5.3 より前の rawurlencode では、チルダ文字 ( ~ )は、RFC1738に従っています。しかし、PHP 5.3 以降、rawurlencode は RFC 3986 に従っており、チルダ文字のエンコーディングは必要ありません。

urlencode は、スペースをプラス記号としてエンコードします(not as %20 で行われるように)( http://us2.php.net/manual/en/function.urlencode.php )

を除くすべての非英数字をパーセント(%)記号とプラス(+)記号としてエンコードされた2桁の16進数およびスペースに置き換えた文字列を返します。WWW フォームからの投稿データがエンコードされるのと同じ方法、つまり application/x-www-form-urlencoded メディアタイプと同じ方法でエンコードされます。これは " RFC 3986 エンコーディング (rawurlencode() 参照) とは異なり、歴史的な理由により、スペースはプラス (+) 記号としてエンコードされます。

の application/x-www-form-urlencoded の定義に相当します。 RFC1866 .

追加の読み物です。

また、以下のサイトでの議論もご覧ください。 http://bytes.com/groups/php/5624-urlencode-vs-rawurlencode .

また RFC 2396 は一見の価値があります。RFC2396は、有効なURIの構文を定義しています。私たちが関心を持つのは、3.4 Query Componentの部分です。

クエリコンポーネント内では、文字 ";", "/", "?", ":", "@",
"&", "=", "+", ",", and "$"
が予約されています。

ご覧の通り + はクエリ文字列の予約文字であるため、RFC 3986 に従って (rawurlencode のように) エンコードされる必要があります。