1472

Webサーバーに送信するクエリ文字列をエンコードする場合-いつ使用escape()し、いつ使用するencodeURI()か、またはencodeURIComponent()

エスケープを使用する:

escape("% +&=");

また

encodeURI()/ encodeURIComponent()を使用します

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");
4

15 に答える 15

1980

エスケープ()

使わないで! セクションB.2.1.2 エスケープescape()で定義されており、附属書 B の導入テキストには次のように記載されています。

... この付録で指定されているすべての言語機能と動作には、1 つ以上の望ましくない特性があり、従来の使用法がない場合は、この仕様から削除されます。...
... プログラマーは、新しい ECMAScript コードを作成するときに、これらの機能や動作の存在を使用したり、想定したりしないでください....

行動:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

特殊文字は、@*_+-./ を除いてエンコードされます。

コード単位の値が 0xFF 以下の文字の 16 進形式は、2 桁のエスケープ シーケンスです%xx

より大きなコード単位の文字には、4 桁の形式%uxxxxが使用されます。これはクエリ文字列内では許可されていません ( RFC3986で定義されています)。

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

パーセント記号は、その直後に 2 つの 16 進数が続く場合にのみ許可されます。パーセント記号の後には許可されuません。

エンコードURI()

有効な URL が必要な場合は、encodeURI を使用します。次のように呼び出します。

encodeURI("http://www.example.org/a file with spaces.html")

取得するため:

http://www.example.org/a%20file%20with%20spaces.html

URL が破棄されて返されるため、encodeURIComponent を呼び出さないでください。

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent と同様に、encodeURI は ' 文字をエスケープしないことに注意してください。

encodeURIComponent()

URL パラメーターの値をエンコードする場合は、encodeURIComponent を使用します。

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

次に、必要な URL を作成します。

var url = "http://example.net/?param1=" + p1 + "&param2=99";

そして、次の完全な URL を取得します。

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

'encodeURIComponent は文字をエスケープしないことに注意してください。一般的なバグは、それを使用して などの html 属性を作成するhref='MyUrl'ことであり、インジェクション バグが発生する可能性があります。文字列から html を作成する場合は、属性引用符"の代わりに使用するか'、エンコーディングのレイヤーを追加します ( '%27 としてエンコードできます)。

このタイプのエンコーディングの詳細については、http: //en.wikipedia.org/wiki/Percent-encodingを確認してください。

于 2010-08-31T12:04:17.180 に答える
475

との違いはencodeURI()encodeURIComponent()encodeURIComponent によってエンコードされているが、encodeURI によってエンコードされていない正確に 11 文字です。

encodeURI と encodeURIComponent の 10 の違いを示す表

次のコードを使用して、Google Chrome のconsole.tableを使用してこのテーブルを簡単に生成しました。

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);

于 2014-05-24T06:54:51.143 に答える
47

この記事は啓発的であることがわかりました: Javascript Madness: Query String Parsing

なぜdecodeURIComponentが「+」を正しくデコードしていないのかを理解しようとしていたときに見つけました。ここに抜粋があります:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!
于 2012-10-09T09:26:43.437 に答える
41

encodeURIComponent は をエンコードしないため-_.!~*'()、データを xml 文字列で php に投稿する際に問題が発生します。

例えば:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

での一般的なエスケープencodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

ご覧のとおり、一重引用符はエンコードされていません。問題を解決するために、プロジェクトで問題を解決するための 2 つの関数を、エンコード URL 用に作成しました。

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

URL をデコードする場合:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}
于 2013-05-08T07:51:13.737 に答える
36

encodeURI()-escape()関数は、HTTPではなくjavascriptエスケープ用です。

于 2008-09-16T19:26:22.293 に答える
18

小さな比較表 Java と JavaScript と PHP。

1. Java URLEncoder.encode (using UTF8 charset)
2. JavaScript encodeURIComponent
3. JavaScript escape
4. PHP urlencode
5. PHP rawurlencode

char   JAVA JavaScript --PHP---
[ ]     +    %20  %20  +    %20
[!]     %21  !    %21  %21  %21
[*]     *    *    *    %2A  %2A
[']     %27  '    %27  %27  %27 
[(]     %28  (    %28  %28  %28
[)]     %29  )    %29  %29  %29
[;]     %3B  %3B  %3B  %3B  %3B
[:]     %3A  %3A  %3A  %3A  %3A
[@]     %40  %40  @    %40  %40
[&]     %26  %26  %26  %26  %26
[=]     %3D  %3D  %3D  %3D  %3D
[+]     %2B  %2B  +    %2B  %2B
[$]     %24  %24  %24  %24  %24
[,]     %2C  %2C  %2C  %2C  %2C
[/]     %2F  %2F  /    %2F  %2F
[?]     %3F  %3F  %3F  %3F  %3F
[#]     %23  %23  %23  %23  %23
[[]     %5B  %5B  %5B  %5B  %5B
[]]     %5D  %5D  %5D  %5D  %5D
----------------------------------------
[~]     %7E  ~    %7E  %7E  ~
[-]     -    -    -    -    -
[_]     _    _    _    _    _
[%]     %25  %25  %25  %25  %25
[\]     %5C  %5C  %5C  %5C  %5C
----------------------------------------
char  -JAVA-  --JavaScript--  -----PHP------
[ä]   %C3%A4  %C3%A4  %E4     %C3%A4  %C3%A4
[ф]   %D1%84  %D1%84  %u0444  %D1%84  %D1%84
于 2015-10-08T15:20:20.967 に答える
9

また、それらはすべて異なる文字セットをエンコードしていることに注意し、必要なものを適切に選択してください。encodeURI() は、encodeURIComponent() よりも少ない文字をエンコードします。encodeURIComponent() は、escape() よりも少ない (また、dannyp の指摘によれば、異なる) 文字をエンコードします。

于 2008-09-16T19:40:32.850 に答える
3

さまざまな方法を試すことは、それらのさまざまな用途と機能が何であるかを十分に把握した後でも、適切な健全性チェックであることがわかりました。

そのために、このウェブサイトは、私が何かを適切に行っているという疑いを確認するのに非常に役立つことがわかりました. また、解釈がかなり難しいencodeURIComponentの文字列をデコードするのにも役立つことが証明されています。持っておくと便利なブックマーク:

http://www.the-art-of-web.com/javascript/escape/

于 2013-08-08T12:34:09.147 に答える
1

私はこの機能を持っています...

var escapeURIparam = function(url) {
    if (encodeURIComponent) url = encodeURIComponent(url);
    else if (encodeURI) url = encodeURI(url);
    else url = escape(url);
    url = url.replace(/\+/g, '%2B'); // Force the replacement of "+"
    return url;
};
于 2013-06-21T12:39:51.527 に答える