urlencode と rawurlencode の違いは? 質問する

urlencode と rawurlencode の違いは? 質問する

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

違いは正確には何で、どちらが好まれるのでしょうか?

ベストアンサー1

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

rawurlencodeはPHP 5.3.0より前はRFC 1738、それ以降はRFC 3986に従います(https://www.php.net/manual/en/function.rawurlencode.php

-_.~ を除くすべての英数字以外の文字がパーセント (%) 記号とそれに続く 2 つの 16 進数字に置き換えられた文字列を返します。これは、リテラル文字が特殊な URL 区切り文字として解釈されるのを防ぎ、文字変換を伴う伝送メディア (一部の電子メール システムなど) によって URL が改ざんされるのを防ぐための、RFC 3986 で説明されているエンコードです。

RFC 3986 と 1738 に関する注意。PHP 5.3 より前の rawurlencode は、チルダ文字 ( ~) を RFC 1738 に従ってエンコードしていました。ただし、PHP 5.3 以降では、rawurlencode は RFC 3986 に従うため、チルダ文字のエンコードは不要です。

urlencodeはスペースをプラス記号としてエンコードします(%20rawurlencodeとは異なります)(https://www.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一見の価値があります。RFC 2396 では有効な URI 構文が定義されています。私たちが注目する主な部分は 3.4 クエリ コンポーネントです。

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

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

おすすめ記事