1. ホーム
  2. javascript

[解決済み] encodeURI / encodeURIComponentの代わりにescapeを使用するのはどのような場合ですか?

2022-03-18 01:49:17

質問

ウェブサーバーに送信するクエリー文字列をエンコードする場合、どのような場合に escape() を使用し、どのような場合に encodeURI() または encodeURIComponent() :

エスケープを使用します。

escape("% +&=");

または

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

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

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

解決方法は?

エスケープ()

使わないでください escape() は、セクション B.2.1.2 エスケープ と、その 附属書Bの導入文 と書かれています。

... この附属書で指定されたすべての言語機能および動作は,一つ以上の望ましくない特性を有しており,レガシーな使い方がなければ,この仕様から削除されるであろう。...
... プログラマは、新しい 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    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

パーセント記号は、16進数2桁が直接続く場合にのみ使用可能で、パーセントの後に u は許可されません。

encodeURI()

作業用のURLが必要な場合はencodeURIを使用します。この呼び出しを行う。

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

を取得する。

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

encodeURIComponentを呼び出すと、URLを破壊して

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

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

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