decodeURIComponentとdecodeURIの違いは何ですか?


回答:


398

これら二つの違いを説明するために、私は間の違いを説明しましょうencodeURIencodeURIComponent

主な違いは次のとおりです。

  • このencodeURI関数は、完全なURIでの使用を目的としています。
  • このencodeURIComponent関数は、区切り記号(; /?:@&= + $、#)の間にある任意の部分である.. well .. URIコンポーネントで使用することを目的としています。

したがって、encodeURIComponentこれらのセパレータは、特殊文字ではなくテキストと見なされるため、エンコードされます。

デコード関数の違いに戻ると、各関数は、対応するエンコード対応によって生成された文字列をデコードし、特殊文字のセマンティクスとその処理を処理します。


4
もう一つの重要な違いは、decodeURI [コンポーネント]ないのに対し、エスケープ解除はマルチバイトUTF-8シーケンスを処理しないということである:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
クリス

私見では、いくつかの例を与えることは非常に有用であろう
transangの

114

encodeURIComponent / decodeURIComponent()は、ほとんどの場合、一緒に連結してURI部分のテキスト文字列を分割するために使用するペアです。

あまり一般的ではなく、誤解を招くように名前が付けられたencodeURI:実際にはfixBrokenURIと呼ばれるべきです。これは、URIに近いものですが、スペースなどの無効な文字が含まれているため、実際のURIに変換されます。これは、ユーザー入力からの無効なURIの修正に有効に使用され、IRI(裸のUnicode文字が含まれるURI)をプレーンURIに変換することもできます(%エスケープされたUTF-8を使用して非ASCIIをエンコードします) )。

decodeURIは、いくつかの特別なものを除いて、decodeURIComponentと同じ文字をデコードします。これは、encodeURIの逆になるように提供されていますが、最初に入力したものと同じものを返すことはまだ期待できません。例を参照してください。decodeURI(encodeURI('%20 '));

encodeURIが実際にfixBrokenURI()という名前である必要がある場合、decodeURI()は同じようにpotentialBreakMyPreviouslyWorkingURI()と呼ばれることもあります。私はそれをどこでも有効に使用できないと考えることができます。避ける。


11
decodeURI(encodeURI( '%20'))は、つまり、クロムとファイアフォックスで '%20'を正しく提供します。どのブラウザ/バージョンから、あなたが観察した誤った結果を疑問に思いますか?
ccppjava

1
2009年に壊れた可能性がありますが、最近のブラウザーは追いついてきました(私の推測)。
WoodrowShigeru 2016

68
js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces

のように見えencodeURIますが、スペースやその他の(印刷できない)文字をエンコードすることで「安全な」URIを生成しますが、encodeURIComponentさらにコロン、スラッシュ、プラス文字をエンコードし、クエリ文字列で使用するためのものです。+と?のエンコーディング &はクエリ文字列の特殊文字であるため、ここでは特に重要です。


30

私は同じ質問をしましたが、ここで答えが見つからなかったので、実際の違いを理解するためにいくつかのテストを行いました。これは、URL / URIに関連しない何かのエンコーディングが必要なためです。

  • encodeURIComponent("A") 「A」を返しますが、「A」を「%41」にエンコードしません
  • decodeURIComponent("%41") 「A」を返します。
  • encodeURI("A") 「A」を返しますが、「A」を「%41」にエンコードしません
  • decodeURI("%41") 「A」を返します。

-つまり、エンコードされていなくても、どちらも英数字をデコードできます。しかしながら...

  • encodeURIComponent("&") 「%26」を返します。
  • decodeURIComponent("%26") 戻り値 "&"。
  • encodeURI("&") 戻り値 "&"。
  • decodeURI("%26") 「%26」を返します。

encodeURIComponentはすべての文字をエンコードするわけではありませんが、decodeURIComponentは%00から%7Fまでの任意の値をデコードできます。

注:%7Fを超える値をデコードしようとすると(Unicode値でない限り)、スクリプトは「URIエラー」で失敗するようです。


注:最初のdecodeURIComponentにタイプミスがあります(nではなくm)。6文字以上編集する必要があるため、修正できません。
SuperNova 2016年

23

encodeURIComponent()

入力をURLエンコードされた文字列に変換します

encodeURI()

入力をURLエンコードしますが、完全なURLが指定されていると想定しているため、プロトコル(http://など)とホスト名( www.stackoverflow.comなど)をエンコードしないことで有効なURLを返します。

decodeURIComponent()そしてdecodeURI()、上記の逆であります


12

decodeURIComponentは、&、?、#などのURI特殊マーカーをデコードしますが、decodeURIはデコードしません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.