2692

GET 文字列に入れることができるように、JavaScript を使用して URL を安全にエンコードするにはどうすればよいでしょうか?

var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;

myUrlその2行目に変数をエンコードする必要があると思いますか?

4

21 に答える 21

3016

組み込み関数のencodeURIComponent(str)encodeURI(str ) を確認してください。
あなたの場合、これはうまくいくはずです:

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);
于 2008-12-02T02:43:57.100 に答える
1617

次の 3 つのオプションがあります。

  • escape()エンコードしません:@*/+

  • encodeURI()エンコードしません:~!@#$&*()=:/,;?+'

  • encodeURIComponent()エンコードしません:~!*()'

ただし、あなたの場合、URLGET他のページのパラメーターに渡したい場合は、 escapeorを使用する必要がありますencodeURIComponentが、 は使用しないでencodeURIください。

詳細については、スタック オーバーフローの質問のベスト プラクティス: エスケープ、または encodeURI / encodeURIComponentを参照してください。

于 2008-12-02T02:49:54.610 に答える
195

固執しencodeURIComponent()ます。この関数encodeURI()は、URL で意味的に重要な多くの文字 ("#"、"?"、"&" など) をわざわざエンコードしません。escape()これは、サーバー上でエンコードされたスペースとして解釈されます (また、ここで他の人が指摘したように、非 ASCII 文字を適切に URL エンコードしません)。

と の違いについてのencodeURI()encodeURIComponent()素晴らしい説明があります。何かをエンコードして、URI のコンポーネントとして (たとえば、クエリ文字列パラメーターとして) 安全に含めることができるようにする場合は、encodeURIComponent().

于 2011-05-29T23:54:43.973 に答える
88

最良の答えは、クエリ文字列のencodeURIComponentに対して使用することです (それ以外の場所では使用しません)。

ただし、多くの API が " " を "+" に置き換えたいと考えているため、以下を使用する必要がありました。

const value = encodeURIComponent(value).replace('%20','+');
const url = 'http://example.com?lang=en&key=' + value

escapeブラウザごとに実装が異なり、encodeURI多くの文字 (# や / など) をエンコードしません。完全な URI/URL を壊さずに使用できるように作られています。これはあまり役に立たず、安全でもありません。

また、@ Jochem が以下で指摘しているようencodeURIComponent()に、(各) フォルダー名で使用したい場合がありますが、何らかの理由でこれらの API はフォルダー名に必要ないように見える+ため、単純な古いencodeURIComponent機能はうまく機能します。

例:

const escapedValue = encodeURIComponent(value).replace('%20','+');
const escapedFolder = encodeURIComponent('My Folder'); // no replace
const url = `http://example.com/${escapedFolder}/?myKey=${escapedValue}`;
于 2012-12-15T08:47:32.280 に答える
43

qs npm パッケージを使用することをお勧めします

qs.stringify({a:"1=2", b:"Test 1"}); // gets a=1%3D2&b=Test+1

JS オブジェクトで使用する方が簡単で、すべてのパラメーターに対して適切な URL エンコードを提供します。

jQuery を使用している場合は、$.paramメソッドを使用します。フィールドを値にマッピングするオブジェクトを URL エンコードします。これは、各値に対してエスケープ メソッドを呼び出すよりも読みやすくなります。

$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1
于 2013-05-13T03:32:25.463 に答える
6

二重エンコーディングを防ぐには、エンコーディングの前に URL をデコードすることをお勧めします (たとえば、ユーザーが入力した URL を扱っている場合、既にエンコードされている可能性があります)。

入力として持っているとしましょうabc%20xyz 123(1 つのスペースは既にエンコードされています):

encodeURI("abc%20xyz 123")            //   wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"
于 2017-01-05T18:49:48.467 に答える
3

何もうまくいきませんでした。私が見たのは、ログインページのHTMLで、コード200でクライアント側に戻ってきました(最初は302ですが、同じAjaxリクエストが別のAjaxリクエスト内にログインページを読み込んでいます。これは、プレーンを読み込むのではなく、リダイレクトするはずでした。ログインページのテキスト)。

ログインコントローラに、次の行を追加しました。

Response.Headers["land"] = "login";

そして、グローバルAjaxハンドラーで、私はこれを行いました:

$(function () {
    var $document = $(document);
    $document.ajaxSuccess(function (e, response, request) {
        var land = response.getResponseHeader('land');
        var redrUrl = '/login?ReturnUrl=' + encodeURIComponent(window.location);
        if(land) {
            if (land.toString() === 'login') {
                window.location = redrUrl;
            }
        }
    });
});

今は問題なく、お守りのように機能します。

于 2012-06-22T03:28:01.250 に答える
3

これはおよびJS 組み込み関数のライブデモです。encodeURIComponent()decodeURIComponent()

<!DOCTYPE html>
<html>
  <head>
    <style>
      textarea{
        width:30%;
        height:100px;
      }
    </style>
    <script>
      // encode string to base64
      function encode()
      {
        var txt = document.getElementById("txt1").value;
        var result = btoa(txt);
        document.getElementById("txt2").value = result;
      }
      // decode base64 back to original string
      function decode()
      {
        var txt = document.getElementById("txt3").value;
        var result = atob(txt);
        document.getElementById("txt4").value = result;
      }
    </script>
  </head>
  <body>
    <div>
      <textarea id="txt1">Some text to decode
      </textarea>
    </div>
    <div>
      <input type="button" id="btnencode" value="Encode" onClick="encode()"/>
    </div>
    <div>
      <textarea id="txt2">
      </textarea>
    </div>
    <br/>
    <div>
      <textarea id="txt3">U29tZSB0ZXh0IHRvIGRlY29kZQ==
      </textarea>
    </div>
    <div>
      <input type="button" id="btndecode" value="Decode" onClick="decode()"/>
    </div>
    <div>
      <textarea id="txt4">
      </textarea>
    </div>
  </body>
</html>
于 2019-02-09T10:26:42.870 に答える
-1

私はいつもこれを使って URL のエンコードを行っています。エンコードする必要がない場合でも、すべての文字をエンコードするため、これは完全に安全です。

function urlEncode(text) {
    let encoded = '';
    for (let char of text) {
        encoded += '%' + char.charCodeAt(0).toString(16);
    }
    return encoded;
}
于 2020-12-11T03:24:55.120 に答える