2010-12-27 17 views
155

URLのエンコードにこれらの2つの方法のどちらを使用する必要がありますか?URLをエンコードするためにencodeURIまたはencodeURIComponentを使用する必要がありますか?

+3

また参照してくださいhttp://stackoverflow.com/a/3608791/632951 – Pacerier

+7

大きな違いの1つは、 'encodeURI'は'/'をエンコードしないということです:' encodeURIComponent( "ac/dc") '=>' ac %2Fdc'と 'encodeURI(" ac/dc ")' => 'ac/dc' – JoeRocc

答えて

194

実際に何をしたいかによって異なります。

encodeURIは、入力が、エンコーディングを必要とする文字を含む完全なURIであるとみなします。

encodeURIComponentでは特別な意味を持つすべてのものをエンコードしますので、あなたがその例で、そのよう

var world = "A string with symbols & characters that have special meaning?"; 
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world); 
66

URLコンポーネント(クエリーストリングパラメータ)に入れる文字列をエンコードする場合は、encodeURIComponentを呼び出す必要があります。

既存のURLをエンコードする場合は、encodeURIに電話してください。

+1

私はajaxを使用していますが、どのようにphpに渡されるURLをデコードするのですか? –

+5

あなたはしません。ウェブサーバーは自動的にそれを行います。 – Quentin

+0

@Aditya:それはあなたが何をしているかによって異なります。 – SLaks

29

http://xkr.us/articles/javascript/encode-compare/偉大な議論を持っているとして、URIのコンポーネントのためにそれを使用します。

"エスケープ()メソッドは、サーバー側のスペースとして解釈される+文字をエンコードせず、フィールドにスペースを含むフォームによって生成されます。この欠点と事実この機能が正常に非ASCII文字を処理するために失敗したことを、可能な限り、あなたはエスケープ()の使用を避けるべき最善の選択肢は、通常encodeURIComponentである()

エスケープを()をエンコードしません:。。@ */+

encodeURI()メソッドの使用は、URLの一部であるクエリーストリングではなく、URIをエンコードする点でescape()よりも少し特殊です。文字列をbにエンコードする必要がある場合は、このメソッドを使用しますURIを使用し、エンコードされないままにする特定の文字を必要とするすべてのリソースに使用されます。このメソッドはURI内の有効な文字であるため、 '文字をエンコードしません。

encodeURI()はエンコードしません:〜@#$ & *()=:/、; +」

最後に、encodeURIComponentで()単一のコンポーネントを符号化する際の方法は、ほとんどの場合に使用されなければなりません!? URIのこのメソッドは、多くのコンポーネントが含まれるように、URIの特殊文字として通常認識される特定の文字をエンコードします。このメソッドはURI内の有効な文字であるため、 '文字をエンコードしません。

encodeURIComponentで()をエンコードしません。!〜*() '」

8

encodeURIComponentでは、():引数が(そのようなプロトコル、ホスト名、パス、またはクエリ文字列など)部分の であることを前提としてい。URIは、そのためには、portionsof URIを分離するために使用される句読点文字をエスケープ

encodeURI():ケースで既存のURL

0

を符号化するために使用されますが、あまりにもこれらの文字をエンコードしたい:! ' *) (、その後、 をソリューションは:

function fixedEncodeURIComponent(str) { 
    return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { 
    return '%' + c.charCodeAt(0).toString(16); 
    }); 
} 

source)原則使用encodeURIComponentとして

+5

あなたはURLでこれらの文字をエスケープするべきではありません。 – Arashsoft

+0

引用されたドキュメントによれば、「これらの文字には、正式なURI区切りの使用がありません」 – caesarsol

+0

@caesarsolです。 –

-2

。それがより一般的な方法だと私には、それがより具体的であると思う長い名前を恐れてはいけません。また、エンコードユリを使ってテストし、正しくエンコードされているように見えますが、おそらくあなたが使用しようとしていたものではなく、ファーストネームフィールドで「フレッド」を使った簡単なテストが機能していても、後でアンパサンドやハッシュタグを追加するなど、より高度なテキストを使用すると失敗します。これがなぜなのか他の答えを見ることができます。

関連する問題