7

古い投稿から: URL のエンコードには、encodeURI または encodeURIComponent を使用する必要がありますか? 、 と言いました:

encodeURI assumes that the input is a complete URI that might have some 
characters which need encoding in it.

encodeURIComponent will encode everything with special meaning, so 
you use it for components of URIs such as

URIas query string パラメータをエンコードする必要がある場合はどうすればよいですか?

例えば

var url = "http://example.com/?next=" + encodeURI(url) 

or


var url = "http://example.com/?next=" + encodeURIComponent(url) 
4

3 に答える 3

39

クエリ文字列をエンコードする場合は、encodeURIComponent. 理由は簡単です。他のいくつかの文字の中で、スラッシュとアマサンドをエンコードしますが、エンコードしencodeURIません。

エンコードURIコンポーネント

使用は何ですか?URL をエンコードしてクエリ文字列に渡したいとします。これにより、すべての文字をエンコードできるため、次のようになります。

encodeURIComponent('http://abc.com/my page.html?name=bob&foo=bar')

結果を得るために

"http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar"

次のように、クエリ文字列として安全に渡すことができます。

http://mysite.com/foo=http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar

両方の URL にクエリ文字列パラメーターfooがあることに注意してください。ただし、エンコードされた URL にはエンコードされているため、問題ありません。全体のfooパラメータは

http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar

foo=barエンコードされた 2 番目の URLとの競合はありません。

エンコードURI

ここで、既にある完全な URL をエンコードする場合は、encodeURI.

encodeURI('http://abc.com/my page.html?name=bob&foo=bar')

あげます

"http://abc.com/my%20page.html?name=bob&foo=bar"

これにより、URL が有効に保たれ、この例ではスペースのみがエンコードされることに注意してください。それを実行encodeURIComponentすると、最初の例で見た混乱が発生します。

エンコードされる文字は何ですか?

最初の投稿で yabol がコメントしたように、このページでは、encodeURI、encodeURIComponent、および escape: lower ASCII characters の違いを示します。encodeURIComponent次の文字をエンコードしてencodeURIいないことに特に気付きます。

chr     encodeURI(chr)  encodeURIComponent(chr)
 +           +               %2B
 /           /               %2F
 @           @               %40
 #           #               %23
 $           $               %24
 &           &               %26
 ,           ,               %2C
 :           :               %3A
 ;           ;               %3B
 =           =               %3D
 ?           ?               %3F

あなたの質問

encodeURIComponentクエリ文字列の URL をエンコードしているため、正しい使用です。これは私の最初の例に戻ります。クエリ文字列 URL (エンコードしている URL) にクエリ文字列が含まれている場合はnext、それをメイン URL の一部ではなく、 の一部にする必要があります。

違う

"http://example.com/?next=" + encodeURI('http://abc.com/my page.html?name=bob&foo=bar')
"http://example.com/?next=http://abc.com/my%20page.html?name=bob&foo=bar"

example.com の URL には、次の 2 つのクエリ文字列パラメーターがnextあります。foo

"http://example.com/?next=" + encodeURIComponent('http://abc.com/my page.html?foo=bar')
"http://example.com/?next=http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar"

example.com の URL には、クエリ文字列パラメーターが 1 つだけ含まれています。next

于 2012-09-29T05:31:52.987 に答える
3

URIをクエリ文字列パラメーターとしてエンコードする必要がある場合は、間違いなく (2) を使用する必要があります。

var url = "http://example.com/?next=" + encodeURIComponent(query_url);

Google 翻訳者を例にとると、翻訳セクションにアドレスを入力するたびに、アドレスは URI コンポーネントに変換され、Google サーバーに渡されます。

URLをコンポーネントとして使用する必要がある場合は、それencodeURIComponent(String);が最善の策です

于 2012-10-05T04:15:17.010 に答える
1

リンクした質問の 2 番目の回答では、「URL コンポーネント (クエリ文字列パラメーター) に入れる文字列をエンコードする場合は、encodeURIComponent を呼び出す必要があります。

既存の URL をエンコードしている場合は、encodeURI を呼び出してください。」

したがって、あなたの例では、encodeURIComponent が正しいものです。

于 2012-09-23T18:53:19.643 に答える